我是一名 Lisp 初学者,试图了解如何正确使用 Lisp 包系统,同时学习 LTK 进行 GUI 编程,使用 SBCL 1.0.55.0.debian 和 Limp 0.3.4(如果重要的话,还有 Debian Wheezy)。我已经使用 aptitude 包管理器(包 cl-asdf 和 cl-common-lisp-controller)安装了 ASDF,然后我使用 Quicklisp 网站(http://www.quicklisp.org/beta/index.html)上的说明安装了 Quicklisp (不是来自 Debian 存储库),然后我(ql:quickload 'ltk)
在 SBCL 控制台中安装了 LTK 。
hello-1.lisp(直接来自 LTK 教程):
(defun hello-1()
(with-ltk ()
(let ((b (make-instance ’button
:master nil
:text "Press Me"
:command (lambda ()
(format t "Hello World!~&")))))
(pack b))))
如果我在一个新的 SBCL Lisp 映像中直接编译它,我会收到消息,WITH-LTK
并且PACK
是未定义的函数并且'BUTTON
是未定义的变量。
所以,我发现我需要先加载'ltk
然后使用in-package
.I 才能运行它,我首先必须在 SBCL 控制台中使用(ql:quickload 'ltk)
和。但是,我仍然有一个未定义变量(in-package :ltk)
的错误消息。'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
*
然后,由于这没有达到我想要的效果,我还尝试根据另一个问题(ltk (common lisp)的问题),Xach 的博客文章“使用 quickproject 制作一个小型 Lisp 项目”的答案来定义我自己的包定义和 Quicklisp” http://xach.livejournal.com/278047.html?thread=674335和 ASDF 手册 ( http://common-lisp.net/project/asdf/asdf/The-defsystem-form.html ) 使用quickproject:make-project
,但没有成功。目前我有以下文件:
(ql:quickload 'ltk)
package.lisp (如果我第一个SBCL REPL编译干净):
(defpackage :hello-world-ltk-system
(:use :cl :asdf :ltk))
hello-world-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 <your.name@example.com>"
:license "Specify license here"
:depends-on (:cl :asdf :ltk)
:components ((:file "package")
(:file "hello-world-ltk")))
hello-world-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))))
当我在成功编译 package.lisp 和 hello-world-ltk.asd (它们都位于同一目录中)后尝试编译这个 hello-world-ltk.lisp 时,我收到以下错误:
; 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
感谢您的任何帮助 :)