Регистрация | Войти
Lisp — программируемый язык программирования
RSS
Подскжите что делать. Не загружается CFFI.
Jenya - 30.11.2009 19:07, Сообщений - 29
* (load "C:\\Program Files\\Steel Bank Common Lisp\\1.0.29\\cffi_0.10.5\\cffi.asd")
; in: DEFSYSTEM CFFI
; ((:MODULE SRC :SERIAL T :COMPONENTS
; ((:FILE "cffi-sbcl") (:FILE "package") (:FILE "utils") (:FILE "libraries")
; (:FILE "early-types") (:FILE "types") (:FILE "enum") (:FILE "strings")
; (:FILE "functions") (:FILE "foreign-vars") (:FILE "features"))))
;
; caught ERROR:
; illegal function call

; in: DEFSYSTEM CFFI
; (ALEXANDRIA TRIVIAL-FEATURES BABEL)
;
; caught STYLE-WARNING:
; undefined function: ALEXANDRIA
;
; caught WARNING:
; undefined variable: BABEL

; (DEFSYSTEM CFFI :DESCRIPTION "The Common Foreign Function Interface" :AUTHOR
; "James Bielman <jamesjb@jamesjb.com>" :VERSION "0.10.5" :LICENCE "MIT"
; :DEPENDS-ON (ALEXANDRIA TRIVIAL-FEATURES BABEL) ...)
;
; caught WARNING:
; undefined variable: CFFI
;
; caught STYLE-WARNING:
; undefined function: DEFSYSTEM

; (ALEXANDRIA TRIVIAL-FEATURES BABEL)
;
; caught WARNING:
; undefined variable: TRIVIAL-FEATURES
;
; compilation unit finished
; Undefined functions:
; ALEXANDRIA DEFSYSTEM
; Undefined variables:
; BABEL CFFI TRIVIAL-FEATURES
; caught 1 ERROR condition
; caught 3 WARNING conditions
; caught 2 STYLE-WARNING conditions

debugger invoked on a UNBOUND-VARIABLE:
The variable TRIVIAL-FEATURES is unbound.

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.

((LAMBDA ()))
0] 
[#]
не делай load asd файлов, их надо загружать при помощи системы asdf: (asdf:operate 'asdf:load-op 'cffi) и если не собираешся допиливать sbcl под винду - возьми clozure cl, он в ней фичастей

зы кстати интересно, как работает этот defsystem
судя по
CL-USER> (describe 'defsystem)
DEFSYSTEM is an internal symbol in #<PACKAGE "COMMON-LISP-USER">.
; No value

не функция, не макрос, кто он вообще такой?
cvb - 30.11.2009 19:14
[#]
Без понятия что за defsystem. А чем плох load?
Jenya - 30.11.2009 19:25
[#]
> А чем плох load?

Тем, что он делает совершенно не то, что нужно для загруки системы :) ASDF при выполнении операции 'load-op проводит специальную настройку окружения, потом вызывает load в данном окружении, анализирует изменения в окружении и проводит загрузку системы в соответствии с указанными правилам, ну, не совсем чётко описал, но примерно так. При некоторых вариантах  составления asdf-файлов для них можно load вызывать, но не с целью загрузки системы (не загрузится), а просто, скажем, для проверки корректности файла.

> кстати интересно, как работает этот defsystem

Это макрос, он добавляет описание системы в список известных систем, вот и всё. При выполнении load-op система ищет в этом списке систему с указанным именем, если находит - загружает, нет - ищет и загружает (если найдёт) файл с соответствующим именем и пробуют снова, если и на этот раз нет - выдаёт ошибку.



archimag - 30.11.2009 19:49
[#]
К сожалению я не могу использовать asdf на Windows. Load пока что работал. Как-нибудь иначе можно побороть эти ошибки?
Jenya - 30.11.2009 20:05
[#]
> К сожалению я не могу использовать asdf на Windows.

Это ещё почему?!

P.S. Я даже сами программы оформляю как asdf-пакеты, не то что библиотеки.
andy128k - 30.11.2009 20:11
[#]

> Это ещё почему?!

Мне дали понять в этой теме http://lisper.ru/forum/thread/107 , что это невозможно (или по крайней мере очень сложно).

Jenya - 30.11.2009 20:26
[#]
>Мне дали понять в этой теме http://lisper.ru/forum/thread/107 , что это невозможно (или по крайней мере очень сложно).

тебе соврали, на самом деле там неплохие советы дали по поводу использования виндовых, этих, как их, аналогов симлинков в общем, asdf-install может вызвать проблемы, но им можно непользоваться

>Это макрос, он добавляет описание системы в список известных систем, вот и всё. При выполнении load-op система ищет в этом списке систему с указанным именем, если находит - загружает, нет - ищет и загружает (если найдёт) файл с соответствующим именем и пробуют снова, если и на этот раз нет - выдаёт ошибку.

да, до меня что-то не сразу дошло что он в пакете asdf определен, смутило что describe сразу не нашел
cvb - 30.11.2009 21:15
[#]
> Мне дали понять в этой теме http://lisper.ru/forum/thread/107 , что это невозможно (или по крайней мере очень сложно).

Буквально сегодня я воспользовался своим же кодом из указанной темы и установил кучу всяких asdf-пакетов на работе (Windows 7, SBCL).
andy128k - 30.11.2009 22:54
[#]
В смысле, установил кучу пакетов и они доступны через asdf благодаря тому коду.

asdf-install не работает в Windows, но я его запускал, ждал пока вывалится с ошибкой, копировал url из консоли и ставил вручную :-D.
andy128k - 30.11.2009 22:58
[#]
> Буквально сегодня я воспользовался своим же кодом из указанной 

Думаю автор просто не понял, что делать с этим кодом, куда его пихать. Надо бы раздобыть статью про asdf, особенно про использование asdf на винде, andy128k не хочешь написать? ;)
archimag - 30.11.2009 23:07
[#]
Ну статья может и не получится. Так, заметка.
andy128k - 01.12.2009 00:21
[#]

> Думаю автор просто не понял, что делать с этим кодом, куда его пихать.

Да, из того обсуждения мало что  понял. Как заметку напишите, дадите почитать? Может подробнее получится..

Jenya - 01.12.2009 01:19
[#]
Вот я тут набросал немного. Надеюсь поможет.
andy128k - 01.12.2009 02:47
[#]
http://lisp.tomsk.ru/wordpress/2007/05/24/asdf-another-system-definition-facility/ - вот ещё есть статья, автор дал добро на любое её использование/переработку, andy128k может возмёшься за это? ну в смысле доработаешь, добавив раздел про винду? И это, твоего блога нет в планете, и это кажется твоё первое сообщение с тэгом lisp, если будешь ещё писать про CL, то могу добавить тебя в планету (буду тянуть сообщения с тэгом lisp или common-lisp) ?
archimag - 01.12.2009 03:26
[#]
Сейчас я написал именно короткую заметку. Раз такое дело, то нужно бы написать про asdf для новичков.

По поводу планеты. Тот блог исключительно развлекательного характера. Если и добавлять, то этот.
andy128k - 01.12.2009 11:12
[#]

Отсюда <a href="http://andy128k.blogspot.com/">http://andy128k.blogspot.com/</a> стало более менее ясно. Спасибо. Но такого пути у меня нет:

> Для SBCL это будет $HOME/.sbclrc



> Вот я тут набросал немного. Надеюсь поможет.

<a href="http://andy128k.livejournal.com/23461.html">тут</a> not found :(

Jenya - 01.12.2009 14:15
[#]
ыч:)) Как у вас на форуме ссылки делать?
Jenya - 01.12.2009 14:17
[#]
>Но такого пути у меня нет:

Имеется в виду (merge-pathnames ".sbclrc" (user-homedir-pathname)). Для sbcl под виндой это вернет что-нибудь вроде "C:/Documents and Settings/_username_/.sbclrc" или "C:/Users/_username_/.sbclrc".
dmitry_vk - 01.12.2009 14:22
[#]
> Как у вас на форуме ссылки делать?

Ну, дык, через панель инструментов :)
archimag - 01.12.2009 14:40
[#]

> Ну, дык, через панель инструментов :)

Всплывающие подсказки и возможность редактировать свои сообщения очень бы помогли :)

Из всего написанного я понял, что мне надо вставить этот код:

(defun search-for-system-in-windows (system)
(let ((system-name (asdf::coerce-name system)))
(dolist (dir asdf:*central-registry*)
(dolist (lnk (directory (merge-pathnames (eval dir) "*.lnk")))
(let ((system-path (parse-windows-shortcut lnk)))
(when (string-equal system-name (pathname-name system-path))
(return-from search-for-system-in-windows system-path)))))))

(pushnew #'search-for-system-in-windows
asdf:*system-definition-search-functions*)

в некий пользовательский файл инициализации .sbclrc .Где dir это директория, содержащая *.lnk файлы на asd файлы неоходимых библиотек. 

Далее: вот это (merge-pathnames ".sbclrc" (user-homedir-pathname)) вернуло #P"C:\\Users\\123\\.sbclrc". Как я понял это и есть этот самый файл инициализации. Но такого файла не существует!:( Поправьте пожалуйста в чем я ошибся. Если у вас получилось, хочу уже разобраться до конца как с этим работать.

Jenya - 01.12.2009 15:06
[#]
>Но такого файла не существует!

Изначально его не существует, надо его создать.

По-видимому, в начало файла (до приведенного кода) надо будет вставить (require 'asdf), иначе asdf не будет доступен, и дальнейший код просто не заработает.
dmitry_vk - 01.12.2009 15:22
[#]
Плюс надо добавлять код отсюда: http://paste.lisp.org/display/91121
archimag - 01.12.2009 15:25
[#]
Спасибо. Еще несколько вопросов. Последний код вставлять без изменений? Просто копи+паст? Как должны выглядеть файлы *.lnk? И что делает функция (merge-pathnames ".sbclrc" (user-homedir-pathname))?
Jenya - 01.12.2009 15:52
[#]
>Как должны выглядеть файлы *.lnk?

*.lnk — это обычный ярлык в windows.

>И что делает функция (merge-pathnames ".sbclrc" (user-homedir-pathname))?

Объединяет два пути. (user-homedir-pathname) возвращает путь до домашнего каталога пользователя (то, что в юниксах обозначают $HOME).
dmitry_vk - 01.12.2009 16:08
[#]
То есть нужно создать ярлыки для всех желаемых asd файлов и назвать их допустим имя_пакета.lnk (cl-ppcre.lnk например)? Я правильно понял?
Jenya - 01.12.2009 16:38
[#]
Нужно создать файл C:\\Users\\123\\.sbclrc, записать в него последовательно:

(require 'asdf)

потом код отсюда,

и в конце код из моей заметки.

Сами пакеты можно разместить где угодно. Создать директорию C:\\Users\\123\\.sbcl\\systems\\ и создать в ней ярлыки на asd-файлы пакетов. Имена ярлыков значения не имеют.
andy128k - 01.12.2009 16:57
[#]
Ясно. Они будут загружаться при старте интерпретатора? Или нужно будет подключать х при помощи (require :имя_пакета)?
Jenya - 01.12.2009 17:17
[#]
Их _можно_ загружать (asdf:oos 'asdf:load-op '<имя-пакета>).

Но лучше всего, если ваша программа тоже будет asdf-пакетом и все нужные пакеты будут загружаться автоматически (указаны в depends-on вашего пакета).
andy128k - 01.12.2009 17:35
[#]
Спасибо. Вроде получилось таким образом подключить drakma.
Jenya - 01.12.2009 18:10
@2009-2013 lisper.ru