* (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
не функция, не макрос, кто он вообще такой?
Без понятия что за defsystem. А чем плох load?
> А чем плох load?
Тем, что он делает совершенно не то, что нужно для загруки системы :) ASDF при выполнении операции 'load-op проводит специальную настройку окружения, потом вызывает load в данном окружении, анализирует изменения в окружении и проводит загрузку системы в соответствии с указанными правилам, ну, не совсем чётко описал, но примерно так. При некоторых вариантах составления asdf-файлов для них можно load вызывать, но не с целью загрузки системы (не загрузится), а просто, скажем, для проверки корректности файла.
> кстати интересно, как работает этот defsystem
Это макрос, он добавляет описание системы в список известных систем, вот и всё. При выполнении load-op система ищет в этом списке систему с указанным именем, если находит - загружает, нет - ищет и загружает (если найдёт) файл с соответствующим именем и пробуют снова, если и на этот раз нет - выдаёт ошибку.
К сожалению я не могу использовать asdf на Windows. Load пока что работал. Как-нибудь иначе можно побороть эти ошибки?
> К сожалению я не могу использовать asdf на Windows.
Это ещё почему?!
P.S. Я даже сами программы оформляю как asdf-пакеты, не то что библиотеки.
> Это ещё почему?!
Мне дали понять в этой теме http://lisper.ru/forum/thread/107 , что это невозможно (или по крайней мере очень сложно).
>Мне дали понять в этой теме http://lisper.ru/forum/thread/107 , что это невозможно (или по крайней мере очень сложно).
тебе соврали, на самом деле там неплохие советы дали по поводу использования виндовых, этих, как их, аналогов симлинков в общем, asdf-install может вызвать проблемы, но им можно непользоваться
>Это макрос, он добавляет описание системы в список известных систем, вот и всё. При выполнении load-op система ищет в этом списке систему с указанным именем, если находит - загружает, нет - ищет и загружает (если найдёт) файл с соответствующим именем и пробуют снова, если и на этот раз нет - выдаёт ошибку.
да, до меня что-то не сразу дошло что он в пакете asdf определен, смутило что describe сразу не нашел
> Мне дали понять в этой теме http://lisper.ru/forum/thread/107 , что это невозможно (или по крайней мере очень сложно).
Буквально сегодня я воспользовался своим же кодом из указанной темы и установил кучу всяких asdf-пакетов на работе (Windows 7, SBCL).
В смысле, установил кучу пакетов и они доступны через asdf благодаря тому коду.
asdf-install не работает в Windows, но я его запускал, ждал пока вывалится с ошибкой, копировал url из консоли и ставил вручную :-D.
> Буквально сегодня я воспользовался своим же кодом из указанной
Думаю автор просто не понял, что делать с этим кодом, куда его пихать. Надо бы раздобыть статью про asdf, особенно про использование asdf на винде, andy128k не хочешь написать? ;)
Ну статья может и не получится. Так, заметка.
> Думаю автор просто не понял, что делать с этим кодом, куда его пихать.
Да, из того обсуждения мало что понял. Как заметку напишите, дадите почитать? Может подробнее получится..
Вот я
тут набросал немного. Надеюсь поможет.
http://lisp.tomsk.ru/wordpress/2007/05/24/asdf-another-system-definition-facility/ - вот ещё есть статья, автор дал добро на любое её использование/переработку, andy128k может возмёшься за это? ну в смысле доработаешь, добавив раздел про винду? И это, твоего блога нет в планете, и это кажется твоё первое сообщение с тэгом lisp, если будешь ещё писать про CL, то могу добавить тебя в планету (буду тянуть сообщения с тэгом lisp или common-lisp) ?
Сейчас я написал именно короткую заметку. Раз такое дело, то нужно бы написать про asdf для новичков.
По поводу планеты. Тот блог исключительно развлекательного характера. Если и добавлять, то
этот.
Отсюда <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 :(
ыч:)) Как у вас на форуме ссылки делать?
>Но такого пути у меня нет:
Имеется в виду (merge-pathnames ".sbclrc" (user-homedir-pathname)). Для sbcl под виндой это вернет что-нибудь вроде "C:/Documents and Settings/_username_/.sbclrc" или "C:/Users/_username_/.sbclrc".
> Как у вас на форуме ссылки делать?
Ну, дык, через панель инструментов :)
> Ну, дык, через панель инструментов :)
Всплывающие подсказки и возможность редактировать свои сообщения очень бы помогли :)
Из всего написанного я понял, что мне надо вставить этот код:
(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". Как я понял это и есть этот самый файл инициализации. Но такого файла не существует!:( Поправьте пожалуйста в чем я ошибся. Если у вас получилось, хочу уже разобраться до конца как с этим работать.
>Но такого файла не существует!
Изначально его не существует, надо его создать.
По-видимому, в начало файла (до приведенного кода) надо будет вставить (require 'asdf), иначе asdf не будет доступен, и дальнейший код просто не заработает.
Спасибо. Еще несколько вопросов. Последний код вставлять без изменений? Просто копи+паст? Как должны выглядеть файлы *.lnk? И что делает функция (merge-pathnames ".sbclrc" (user-homedir-pathname))?
>Как должны выглядеть файлы *.lnk?
*.lnk — это обычный ярлык в windows.
>И что делает функция (merge-pathnames ".sbclrc" (user-homedir-pathname))?
Объединяет два пути. (user-homedir-pathname) возвращает путь до домашнего каталога пользователя (то, что в юниксах обозначают $HOME).
То есть нужно создать ярлыки для всех желаемых asd файлов и назвать их допустим имя_пакета.lnk (cl-ppcre.lnk например)? Я правильно понял?
Нужно создать файл C:\\Users\\123\\.sbclrc, записать в него последовательно:
(require 'asdf)
потом код
отсюда,
и в конце код из моей заметки.
Сами пакеты можно разместить где угодно. Создать директорию C:\\Users\\123\\.sbcl\\systems\\ и создать в ней ярлыки на asd-файлы пакетов. Имена ярлыков значения не имеют.
Ясно. Они будут загружаться при старте интерпретатора? Или нужно будет подключать х при помощи (require :имя_пакета)?
Их _можно_ загружать (asdf:oos 'asdf:load-op '<имя-пакета>).
Но лучше всего, если ваша программа тоже будет asdf-пакетом и все нужные пакеты будут загружаться автоматически (указаны в depends-on вашего пакета).
Спасибо. Вроде получилось таким образом подключить drakma.