Здравствуйте.
Вопрос новичка. Нахожусь на стадии чтения литературы и запуска предлагаемых примеров в окошках. Где можно найти простой пример реализации стандартного приложения базы данных oracle, состоящего из формы просмотра таблицы и формы редактирования одной записи? Например, телефонный справочник.
Мне пока не удалось подобрать и настроить среду Lisp или Scheme. Чтобы в ней была возможность создавать приложения работающие с базой данных Oracle и отрисовывать GUI на Java (oracle и gui обязательно, чтобы можно было на работе заняться лиспом). У кого нибудь есть уже настроенная среда вместе с библиотеками на системе Windows? Ну и пример приложения нужен. Книжки читать хорошо, но с нуля быстро создать даже такое простое приложение мне не под силу.
Спасибо.
Нужна действительно настроенная среда с максимальным количеством библиотек. Подгружать их не могу, т.к. стоит proxy. А дома совершенно нет возможности подыскивать, подгружать и пробовать нужные библиотеки.
LispWork вроде все внутри себя держит, но слишком дорого для "игры разума", а бесплатная не содержит драйверов доступа к базе Oracle. Bigloo поставил, но библиотека bigloo-lib с драйверами oracle не откомпилировалась на Windows из за нескольких ошибок. Пару дней помучился и бросил. По остальным вариантам для связки oracle + java/.net тоже толком ничего не вышло.
Пример приложения телефонного справочника через веб интерфейс тоже неплохо было бы найти, но к сожалению, на просторах инета только php, mysql, java, apache и все подобные императивные сочетания. Нуждаюсь в примерах именно такого класса приложений - база плюс интерфейс просмотра и исправления данных к ней. Вроде ничего сложного, в среде VS, Delphi, Java можно за час-два реализовать.. А на лиспе?
Почему бы не взять Clojure?
И GUI на Java будет и Oracle.
Charlz_Klug, Cинтаксис у Clojure отличается от Common Lisp. Хотелось бы придерживаться основного мэйнстрима. С запасом, если можно так выразиться.
Конечно, если не удастся добиться приемлемого варианта с другими реализациями лиспа, то придется освоить Clojure.
Тебе нужен LispWorks или забей.
Я такое предполагал, ага.. Жестоко. :) разве что ЛиспВорк с таблетками искать..
Есть ещё Armed Bear Common Lisp.
> Жестоко. :)
Ну просто Oracle+GUI+Windows кому это надо в open-source? Если какие решение не на базе LispWorks и используются в коммерческих системах (а такое есть), то это серверные решения под Linux.
Нет, я начинал, но потом ещё в начальной стадии принял другое решение и это стало не нужным.
cl-oracle - Common Lisp library for interacting with Oracle databases via OCILIB.
Спасиб за наводку.. Но как это и к чему прикрутить?
> Ну просто Oracle+GUI+Windows кому это надо в open-source? Если какие решение не на базе LispWorks и используются в коммерческих системах (а такое есть), то это серверные решения под Linux.
Ага, оттого и совершенно мало таки примеров. Потому и написал сюда. :)
> Armed Bear Common Lisp.
Как то упустил его из виду, спасибо. Сейчас пытаюсь хоть какой нибудь заваляющий простейший примерчик найти.
Есть ещё Kawa (реализация Scheme на Java) .
Я вот не пойму. Если вы позволяете себе иметь парк windows машин и oracle, тогда почему не можете позволить себе LW? Раз уж решили кормить проприетарщину так кормите их всех.
А на попробовать можно триальную версию.
Наш путь - веб интерфейс + web-сервер + postgres.
Яркий пример - сайт на котором мы сейчас.
> Яркий пример - сайт на котором мы сейчас.
На самом деле у меня уже есть код нового форума на базе MongoDB. Когда-нибудь допишу все и будет "обновление".
> на базе MongoDB
А в чём причина выбора? В более лучшей заточености под контент? Или легкость платформы?
> А в чём причина выбора?
Just for fun :) Не люблю SQL
1. Есть библиотеки для работы с ODBC
2. У лиспворкса ты можешь запросить полную evaluation версию для игр разума. Если там есть, то, что тебе надо, это решит твой вопрос.
3. В целом, вариант работы с лиспом без библиотек не жизнеспособен. Решай этот вопрос.
Благодарю всех за ответы. С "Джававскими" версиями лиспа пока разбираюсь.
Хочу кратко пояснить про схему работы. Oracle для меня - основное "место работы" с своей средой. Мне нужно просто сменить эту среду на лисповскую, чтобы его изучить. Идея состоит в том, чтобы работать дальше с Oracle, но через лисп: нечто пишешь в нем ("лиспе"), вставляя нужные запросы к базам данных. Чисто для изучения - получается, что и работа делается, и лисп осваивается. На этом начальном этапе бог с ним с этим GUI.
У кого нибудь из вас есть настроенная связка с oracle? Например, sbcl с нужными библиотеками (библиотек чем больше, тем лучше)? Для windows. Чтобы можно было ее просто распаковать и сразу работать. SBCL, например, я поставил, но подгрузить нужные библиотеки не могу из за прокси. В руководствах прописано, что можно через прокси библиотеки подгружать, но если они не защищены паролем. Такая же картина и для других реализация лиспа (чего только нет?!) - но прокси с паролем стоит, плюс ограничения по портам. Безопасность "зажимает". Заранее спасибо.
Что же касается проприетарщины, то oracle нам достался в наследство от предыдущих поколений руководства. А сейчас с деньгами у всех напряг плавно подкрался.
> У лиспворкса ты можешь запросить полную evaluation версию для игр разума.
написал им письмо, но пока молчат
Кстати, у какой нибудь Scheme есть доступ к Oracle? не через ODBC
all writed:
> Наш путь - веб интерфейс + web-сервер + postgres.
Да, здорово получилось!
> В целом, вариант работы с лиспом без библиотек не жизнеспособен. Решай этот вопрос.
Согласен. Но я пока не знаю, как подключить библиотеки вручную. Хоть к какой нибудь реализации. Библиотеки то загрузить есть возможность напрямую по ссылкам. Но потом надо их как то подключить к реализации лиспа. Cтоит сейчас у меня - sbcl, ccl (wx86cl). Самостоятельно ни к той ни к другой пока не вышло.
если я правильно понял, то надо всю работу quicklisp'а вручную сделать?
> всю работу quicklisp'а вручную сделать?
Да, похоже что так..
И если есть у кого готовый каталог "с:/sbcl" с библиотеками, выложите пожалуйста.
Второй вариант - нужен рецепт ручной загрузки библиотек.
библиотеки отдельно расположены.У тебя сам quicklisp установился?
quicklisp.list скачал вручную
Настройки среды windows:
ASDF_OUTPUT_TRANSLATIONS=D:/sbcl/fasl-cache/
CL_SOURCE_REGISTRY=D:/sbcl/libraries/
path=/c/sbcl/
Структура каталогов такая:
c:/sbcl
quicklib.lisp
sbcl.exe
sbcl.core
c:/sbcl/contrib
c:/sbcl/fasl-cashe
c:/sbcl/libraries
c:/sbcl/libraries/cl-md5
c:/sbcl/libraries/clsql
c:/sbcl/libraries/uffi
Каталоги clsql, uffi добавил вручную из http://uffi.b9.com и http://clsql.b9.com
В описании clsql вижу картину:
--------------------------------
Loading
After downloading and installing ASDF, simply push the directory containing UFFI into asdf:*central-registry* variable. Whenever you want to load the UFFI package, use the form (asdf:operate 'asdf:load-op :uffi).
--------------------------------
в описании clsql вижу картину:
--------------------------------
Add UFFI path
Unzip or untar the UFFI distribution which creates a directory for the UFFI files. Add that directory to ASDF's asdf:*central-registry*. You can do that by pushing the pathname of the directory onto this variable. The following example code assumes the UFFI files reside in the /usr/share/lisp/uffi/ directory.
(push #P"/usr/share/lisp/uffi/" asdf:*central-registry*)
Add MD5 path
If you plan to use the clsql-postgresql-socket interface, you must load the md5 module. Unzip or untar the cl-md5 distribution, which creates a directory for the cl-md5 files. Add that directory to ASDF's asdf:*central-registry*. You can do that by pushing the pathname of the directory onto this variable. The following example code assumes the cl-md5 files reside in the /usr/share/lisp/cl-md5/ directory.
(push #P"/usr/share/lisp/cl-md5/" asdf:*central-registry*)
Add CLSQL path and load module
Unzip or untar the CLSQL distribution which creates a directory for the CLSQL files. Add that directory to ASDF's asdf:*central-registry*. You can do that by pushing the pathname of the directory onto this variable. The following example code assumes the CLSQL files reside in the /usr/share/lisp/clsql/ directory. You need to load the clsql system.
(push #P"/usr/share/lisp/clsql/" asdf:*central-registry*)
(asdf:operate 'asdf:load-op 'clsql) ; main CLSQL package
Run test suite (optional)
The test suite can be executed using the ASDF test-op operator. If CLSQL has not been loaded with asdf:load-op, the asdf:test-op operator will automatically load CLSQL. A configuration file named .clsql-test.config must be created in your home directory. There are instructures on the format of that file in the tests/README. After creating .clsql-test.config, you can run the test suite with ASDF:
(asdf:operate 'asdf:test-op 'clsql)
--------------------------------
Запускаем среду:
* (require :asdf)
("ASDF")
* (push #P"c:/sbcl/libraries/uffi/" asdf:*central-registry*)
(#P"c:/sbcl/libraries/uffi/")
* (push #P"c:/sbcl/libraries/cl-md5/" asdf:*central-registry*)
(#P"c:/sbcl/libraries/cl-md5/" #P"c:/sbcl/libraries/uffi/")
* (push #P"c:/sbcl/libraries/clsql/" asdf:*central-registry*)
(#P"c:/sbcl/libraries/clsql/" #P"c:/sbcl/libraries/cl-md5/"
#P"c:/sbcl/libraries/uffi/")
Дальше пошла засада:
* (asdf:operate 'asdf:load-op :uffi)
debugger invoked on a SIMPLE-ERROR in thread
#<THREAD "main thread" RUNNING {24086601}>:
Uneven number of components in source to destination mapping:
"D:/sbcl/fasl-cache/"
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(ASDF/OUTPUT-TRANSLATIONS:PARSE-OUTPUT-TRANSLATIONS-STRING "D:/sbcl/fasl-cache/" :LOCATION NIL)
0]
И еще одна засада:
* (asdf:operate 'asdf:load-op 'clsql)
debugger invoked on a LOAD-SYSTEM-DEFINITION-ERROR in thread #<THREAD "main thread" RUNNING {24086601}>: Error while trying to load definition for system clsql
from pathname c:/sbcl/libraries/clsql/clsql.asd: Uneven number of components in source to destination mapping: "D:/sbcl/fasl-cache/"
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [RETRY ] Retry EVAL of current toplevel form.
1: [CONTINUE ] Ignore error and continue loading file "c:\\sbcl\\libraries\\clsql\\clsql.asd".
2: [ABORT ] Abort loading file "c:\\sbcl\\libraries\\clsql\\clsql.asd".
3: [REINITIALIZE-SOURCE-REGISTRY-AND-RETRY] Retry finding system clsql after reinitializing the source-registry.
4: Exit debugger, returning to top level.
((FLET #:HANDLER8969 :IN ASDF/FIND-SYSTEM:LOAD-ASD) #<SIMPLE-ERROR "~@<Uneven number of components in source to destination mapping: ~3i~_~S~@:>" {24661699}>)
0]
> ASDF_OUTPUT_TRANSLATIONS=D:/sbcl/fasl-cache/
> CL_SOURCE_REGISTRY=D:/sbcl/libraries/
здесь опечатался - все на диске с:
ASDF_OUTPUT_TRANSLATIONS=С:/sbcl/fasl-cache/
CL_SOURCE_REGISTRY=С:/sbcl/libraries/
Каталог C:\sbcl\contrib :
asdf.fasl
sb-aclrepl.asd
sb-aclrepl.fasl
sb-bsd-sockets.asd
sb-bsd-sockets.fasl
sb-cltl2.asd
sb-cltl2.fasl
sb-concurrency.asd
sb-concurrency.fasl
sb-cover.asd
sb-cover.fasl
sb-executable.asd
sb-executable.fasl
sb-gmp.asd
sb-gmp.fasl
sb-grovel.asd
sb-grovel.fasl
sb-introspect.asd
sb-introspect.fasl
sb-md5.asd
sb-md5.fasl
sb-mpfr.asd
sb-mpfr.fasl
sb-posix.asd
sb-posix.fasl
sb-queue.asd
sb-queue.fasl
sb-rotate-byte.asd
sb-rotate-byte.fasl
sb-rt.asd
sb-rt.fasl
sb-simple-streams.asd
sb-simple-streams.fasl
sb-sprof.asd
sb-sprof.fasl
Получается что uffi не могу загрузить:
Uneven number of components in source to destination mapping: "С:/sbcl/fasl-cache/"
А без него и clsql не грузится:
debugger invoked on a LOAD-SYSTEM-DEFINITION-ERROR in thread #<THREAD "main thread" RUNNING {24086689}>: Error while trying to load definition for system clsql from pathname c:/sbcl/libraries/clsql/clsql.asd: READ error during LOAD: Package UFFI does not exist.Line: 100, Column: 31, File-Position: 3816Stream: #<SB-SYS: FD-STREAM for "file c:\\sbcl\\libraries\\clsql\\clsql.asd" {24640311}>
А почему не хочешь воспользоваться quicklisp-ом? Он вроде умеет грузить множество библиотек.
Касаемо работы с ораклом через лисп - эта идея хороша. У меня есть много наработок на эту тему, в основном для Firebird, но можно портировать.
Это имеет смысл обсудить приватно. Напиши мне письмо на
(concatenate 'string (reverse "s30revres") '(#\@) (reverse "liam") '(#\. #\r) "u")
У нас прокси стоит с аутентификацией. quicklisp пока только в открытую может
(quicklisp-quickstart:install :proxy "http://myproxy.site.com:8080/")
Похоже мне и quickstart не удалось поставить. Это я просто файлик quicklisp.lisp скачал.
Я все вот по этой шпаргалке делал: http://habrahabr.ru/post/131418/
Спасибо за советы и предложения.
Завтра при наличии времени попытаюсь настроить sbcl заново.
Наткнулся на программку - http://www.delegate.org/delegate/
Может с ее помощью удастся поставить quicklist и все остальное.
Мимокрокодил:
CL-USER>
(ql:system-apropos "oracl")
#<SYSTEM hu.dwim.perec.oracle / hu.dwim.perec-20140826-darcs / quicklisp 2014-08-26>
#<SYSTEM hu.dwim.perec.oracle.test / hu.dwim.perec-20140826-darcs / quicklisp 2014-08-26>
#<SYSTEM hu.dwim.rdbms.oracle / hu.dwim.rdbms-20140211-darcs / quicklisp 2014-08-26>
#<SYSTEM hu.dwim.rdbms.oracle.test / hu.dwim.rdbms-20140211-darcs / quicklisp 2014-08-26>
CL-USER>
(sort (map 'list
#'ql-dist:system-file-name
(remove-duplicates
(alexandria:flatten
(ql-dist:dependency-tree
(ql-dist:find-system "hu.dwim.perec.oracle")))))
#'string<)
("alexandria" "anaphora" "asdf-system-connections" "babel" "bordeaux-threads"
"cffi" "cl-containers" "cl-fad" "cl-ppcre" "closer-mop" "contextl"
"hu.dwim.asdf" "hu.dwim.common" "hu.dwim.common-lisp" "hu.dwim.computed-class"
"hu.dwim.computed-class+hu.dwim.defclass-star" "hu.dwim.def"
"hu.dwim.def+contextl" "hu.dwim.def+hu.dwim.common"
"hu.dwim.def+hu.dwim.delico" "hu.dwim.def.namespace" "hu.dwim.defclass-star"
"hu.dwim.defclass-star+hu.dwim.def" "hu.dwim.delico" "hu.dwim.logger"
"hu.dwim.perec" "hu.dwim.perec.oracle" "hu.dwim.rdbms" "hu.dwim.rdbms.oracle"
"hu.dwim.serializer" "hu.dwim.syntax-sugar"
"hu.dwim.syntax-sugar+hu.dwim.walker" "hu.dwim.util"
"hu.dwim.util.error-handling" "hu.dwim.util.mop" "hu.dwim.util.threads"
"hu.dwim.walker" "ironclad" "iterate" "local-time" "lw-compat" "metabang-bind"
"metacopy" "metacopy-with-contextl" "metatilities-base" "moptilities"
"nibbles" "parse-number" "trivial-features" "trivial-garbage"
"verrazano-runtime")CL-USER>
Ещё гуглится что-то в коробке с clisp. Может повезёт - заработает.
> http://www.delegate.org/delegate/
WTF?
http://www.quicklisp.org/> WTF?
Понял, снимаю вопрос.
было время - я попробовал установить clsql и uffi без quicklisp'a:uffi:; compilation unit finished
; printed 14 notes
clsql:; compilation unit finished
; caught 2 STYLE-WARNING conditions
; printed 5 notes
Поставить библиотеки удалось с помощью "делегата" по схеме:
--------------------------------------------
C:\delegate\DGROOT\bin>con32-dg9_9_13.exe -P8081 SERVER=http PROXY="http://proxy.you.ru:1234:*" MYAUTH="usr:psw" ADMIN="foo@foo.com"
cd C:\sbcl
C:\sbcl>sbcl --load quicklisp.lisp
* (quicklisp-quickstart:install :proxy "http://localhost:8081/")
* (ql:quickload "uffi" :proxy "http://localhost:8081/")
* (ql:quickload "clsql" :proxy "http://localhost:8081/")
Но дальше пока не продвинулся, oracle не подгрузился:
-------------------------------------------------
* (load "~/quicklisp/setup.lisp")
* (ql:quickload "clsql")
* (ql:quickload "clsql-uffi")
* (ql:quickload "clsql-oracle")
debugger invoked on a QUICKLISP-CLIENT:SYSTEM-NOT-FOUND in thread
#<THREAD "main thread" RUNNING {24086661}>:
System "clsql-oracle" not found
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [CONTINUE] Try again
1: [ABORT ] Give up on "clsql-oracle"
2: Exit debugger, returning to top level.
((LABELS QUICKLISP-CLIENT::RECURSE :IN QUICKLISP-CLIENT::COMPUTE-LOAD-STRATEGY) "clsql-oracle")
0]
mysql подгрузился:
--------------------
* (ql:quickload "clsql-mysql")
To load "clsql-mysql":
Load 1 ASDF system:
clsql-mysql
; Loading "clsql-mysql"
.
("clsql-mysql")
Oracle не смог подгрузиться, хотя в нужном каталоге clsql-oracle.asd присутствует.
Куда дальше копать? :)
А ты её вот так: (asdf:load-system 'clsql-oracle)
> (asdf:load-system 'clsql-oracle)
пока не получилось - не видит каталоги
quicklisp по умолчанию установился в каталог
C:\Users\user\quicklisp\*
И прописка подкаталогов, содержащих uffi и clsql ничего не дала.
Это что-то asdf тупит, перед load сделай:
(push "путь-до-места-где-лежит-clsql-cо-слешем-на-конце" asdf:*central-registry*)
* (push "с:/ws/ql/dists/quicklisp/software/clsql-20140713-git/" asdf:*central-registry*)* (ql:quickload :clsql-oracle)
To load "clsql-oracle":
Load 1 ASDF system:
clsql-oracle
; Loading "clsql-oracle"
debugger invoked on a ASDF/FIND-COMPONENT:MISSING-DEPENDENCY-OF-VERSION in thread
#<THREAD "main thread" RUNNING {1004EBE3A3}>:
Component CLSQL-UFFI-SYSTEM::UFFI does not match version 2.0, required by
#<SYSTEM "clsql-uffi">
Убрал из clsql-uffi.asd
(:version uffi "2.0")
по идее разбираться надо зачем ему этот dep.
* (ql:quickload :clsql-oracle)
Пошел загружать, библиотек у меня конечно нет:
Load 1 ASDF system:
clsql-oracle
; Loading "clsql-oracle"
[package clsql-uffi]..............................
[package clsql-oracle]
debugger invoked on a SIMPLE-ERROR in thread
#<THREAD "main thread" RUNNING {1004EBE3A3}>:
Couldn't load foreign libraries "libclntsh", "oci". (searched *FOREIGN-LIBRARY-SEARCH-PA
THS*: NIL)
Спасибо. Сработало. Была проблема в старых переменных окружения.
Экспериментировал много и не все вычистил. Итак:
* (require 'asdf)
* (push #P"~/quicklisp/dists/quicklisp/software/uffi-20130813-git/" asdf:*central-registry*)
* (push #P"~/quicklisp/dists/quicklisp/software/clsql-20140713-git/" asdf:*central-registry*)
* (asdf:load-system 'clsql-oracle)
* (in-package #:clsql-user)
* (connect '("db" "user" "psw") :database-type :oracle)
--------------
debugger invoked on a UNBOUND-VARIABLE in thread
#<THREAD "main thread" RUNNING {24086601}>:
The variable CLSQL-ORACLE::C--STMT-STRING is unbound.
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
--------------
Пришлось править файл oracle-sql.lisp ручками:
на 517 строке: (uffi:foreign-string-length c-stmt-string)
нужно заменить c--stmt-string на c-stmt-string.
(Интернет - великая сила. Иногда.)
Перегружаем пакет и подключаемся
* (asdf:load-system 'clsql-oracle)
* (connect '("db" "user" "psw") :database-type :oracle)
-------------
#<CLSQL-ORACLE:ORACLE-DATABASE db/user OPEN {25D36641}>
Дальше буду экспериментировать.
Но напрягает, что загрузка пакета командой (asdf:load-system 'clsql-oracle)
слишком многословна - это всегда так будет при подключении?
Перезашел в sbcl и попробовал заново quicklisp. Удивительное дело, но он уже заработал.
Получается, что asdf что то сделал? Или это ошибка c--stmt-string на 517 строке oracle-sql.lisp мешала?
Итак:
* (ql:quickload "clsql")
To load "clsql":
Load 1 ASDF system:
clsql
; Loading "clsql"
[package cmucl-compat]............................
[package clsql-sys]...............................
[package clsql]...................................
[package clsql-user]..............................
..................................................
[package ansi-loop].............................
("clsql")
* (ql:quickload "clsql-uffi")
To load "clsql-uffi":
Load 1 ASDF system:
clsql-uffi
; Loading "clsql-uffi"
[package clsql-uffi].
("clsql-uffi")
* (ql:quickload "clsql-oracle")
To load "clsql-oracle":
Load 1 ASDF system:
clsql-oracle
; Loading "clsql-oracle"
[package clsql-oracle]............................
1) Любую многословность можно завернуть в ф-ции, макросы, dsl-и.2) Чтобы каждый раз не загружать, сделай свой образ, стартовать будет мгновенно со всеми загруженными пакетами.
;; load-им что надо...
(sb-ext:save-lisp-and-die "core.my")
делаем пускач: sbcl --core path/to/core.my