Я начинаю Lisp, пытаясь понять, как правильно использовать систему пакетов Lisp, изучая LTK для программирования GUI, используя SBCL 1.0.55.0.debian и Limp 0.3.4 (и Debian Wheezy, если это имеет значение). Я установил ASDF с помощью диспетчера пакетов aptitude (пакеты cl-asdf & cl-common-lisp-controller), затем я установил Quicklisp, используя инструкции на веб-сайте Quicklisp (http://www.quicklisp.org/beta/index.html) (не из репозитория Debian), а затем я установил LTK с (ql:quickload 'ltk)
в консоли SBCL.Правильный способ определения пакетов с использованием asdf: defsystem и quickproject
привет-1.lisp (непосредственно из ЛОК учебника):
(defun hello-1()
(with-ltk()
(let ((b (make-instance ’button
:master nil
:text "Press Me"
:command (lambda()
(format t "Hello World!~&")))))
(pack b))))
Если я компилирую это прямо в новом SBCL Лисп изображения, я получаю сообщение, что WITH-LTK
и PACK
являются неопределенными функциями и 'BUTTON
является Неопределенная переменная.
Итак, я узнал, что мне нужно, чтобы загрузить 'ltk
первый, а затем использовать in-package
.I, чтобы иметь возможность запустить его, я сначала использовать (ql:quickload 'ltk)
и (in-package :ltk)
в SBCL консоли. Тем не менее, я все еще являюсь сообщением об ошибке, что 'BUTTON
- неопределенная переменная.
* (ql:quickload 'ltk)
To load "ltk":
Load 1 ASDF system:
ltk
; Loading "ltk"
(LTK)
* (in-package :ltk)
#<PACKAGE "LTK">
* (compile-file "/home/user/code/lisp/hello-1.lisp")
; caught WARNING:
; undefined variable: ’BUTTON
;
; compilation unit finished
; Undefined variable:
; ’BUTTON
; caught 1 WARNING condition
; /home/user/code/lisp/hello-1.fasl written
; compilation finished in 0:00:00.009
#P"/home/user/code/lisp/hello-1.fasl"
T
T
*
Тогда, как это не сработало так, как я хотел, я также пытался определить свои собственные определения пакета в соответствии с ответами другим вопроса (Problems with ltk (common lisp)), запись в блог Xach в «Создании небольшого лисповского проекта с quickproject и Quicklisp "http://xach.livejournal.com/278047.html?thread=674335 и ASDF Manual (http://common-lisp.net/project/asdf/asdf/The-defsystem-form.html) с использованием quickproject:make-project
, но безуспешно. В настоящее время у меня есть следующие файлы:
package.lisp (компилируется, если я первый (ql:quickload 'ltk)
SBCL РЕПЛ):
(defpackage :hello-world-ltk-system
(:use :cl :asdf :ltk))
привет-мир-ltk.asd (компилируется после того, как я первый составлен package.lisp):
(in-package :hello-world-ltk-system)
(asdf:defsystem :hello-world-ltk
:serial t
:description "Describe hello-world-ltk here"
:author "Your Name <[email protected]>"
:license "Specify license here"
:depends-on (:cl :asdf :ltk)
:components ((:file "package")
(:file "hello-world-ltk")))
привет-мир-ltk.lisp (я получаю ошибку компиляции The name "HELLO-WORLD-LTK" does not designate any package
).
(require 'hello-world-ltk)
(in-package :hello-world-ltk)
(defun hello-world-1()
(with-ltk()
(let ((b (make-instance 'button
:master nil
:text "Press me!"
:command (lambda()
(format t "Hello world!~&")))))
(pack b))))
При попытке скомпилировать этот привет-мир-ltk.lisp после успешной компиляции package.lisp и привет-мир-ltk.asd (которые все находятся в том же каталоге) Я получаю следующее сообщение об ошибке:
; compiling (IN-PACKAGE :HELLO-WORLD-LTK)
debugger invoked on a SB-KERNEL:SIMPLE-PACKAGE-ERROR in thread
#<THREAD "initial thread" RUNNING {10029A0FA3}>:
The name "HELLO-WORLD-LTK" does not designate any package.
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.
(SB-INT:%FIND-PACKAGE-OR-LOSE "HELLO-WORLD-LTK")
0]
(load "/home/user/code/lisp/hello-world-ltk/hello-world-ltk")
debugger invoked on a SIMPLE-ERROR in thread
#<THREAD "initial thread" RUNNING {10029A0FA3}>:
attempt to load an empty FASL file:
"/home/user/code/lisp/hello-world-ltk/hello-world-ltk.fasl"
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Reduce debugger level (to debug level 1).
1: Exit debugger, returning to top level.
(SB-FASL::LOAD-AS-FASL
#<SB-SYS:FD-STREAM
for "file /home/user/code/lisp/hello-world-ltk/hello-world-ltk.fasl"
{1005291233}>
NIL
#<unavailable argument>)
0[2]
Итак, я совершенно потерял здесь со всеми различными способами, чтобы определить пакеты, ASDF, Quicklisp, package.lisp, quickproject
, asdf:defsystem
, require
и ql:quickload
... quickproject:make-project
выглядит многообещающим, но я действительно не узнайте, что еще не так с моими исходными файлами. Я ищу решение, которое должно обрабатывать все компиляции и загрузки пакетов предпочтительно в одной команде для всего проекта, и это должно быть расширяемо для больших проектов.
Спасибо за любую помощь :)
Это не ответ, а возможный ресурс: я нашел [главу на упаковке] (http://www.gigamonkeys.com/book/programming-in-the-large-packages-and-symbols.html) из книги [Practical Common Lisp] (http://www.gigamonkeys.com/book/), чтобы помочь мне лучше понять, как это работает. Возможно, это будет полезно для вас и/или других людей, которые найдут этот вопрос. – lindes
Я тоже читал эту главу, и я считаю ее полезной. Тем не менее, [Practical Common Lisp] (http://www.gigamonkeys.com/book/) не касается систем, созданных с помощью 'asdf: defsystem' или использования' quickproject'. Ответ Всеволода (внизу) помог мне понять разницу между пакетами и системами. – nrz
действительно, это только для помощи с пониманием стороны пакета вещей. Так что только часть головоломки. Рад, что это полезная часть, хотя, по крайней мере. :) – lindes