ltk(常见的lisp)的问题

时间:2010-03-14 17:42:10

标签: lisp common-lisp asdf ltk

我使用asdf-install将ltk安装到Steel Bank Common Lisp,但我甚至无法开始使用它V_V。下面的代码是文档中最简单的示例,几乎是逐字复制的。


(asdf:operate 'asdf:load-op :ltk)

(defun hello-1()
  (with-ltk ()
   (let ((b (make-instance 'button
                           :master nil
                           :text "Press Me"
                           :command (lambda ()
                                      (format t "Hello World!~&")))))
     (pack b))))
(hello-1)

这是我从sbcl获得的错误消息:


> ; in: LAMBDA NIL
;     (PACK B)
; 
; caught STYLE-WARNING:
;   undefined function: PACK

;     (WITH-LTK NIL
;      (LET ((B (MAKE-INSTANCE 'BUTTON :MASTER NIL :TEXT "Press Me" :COMMAND #)))
;        (PACK B)))
; 
; caught STYLE-WARNING:
;   undefined function: WITH-LTK
; 
; compilation unit finished
;   Undefined functions:
;     PACK WITH-LTK
;   caught 2 STYLE-WARNING conditions

debugger invoked on a SIMPLE-ERROR in thread #<THREAD "initial thread" RUNNING {1002A57B61}>:
  There is no class named BUTTON.

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-PCL::FIND-CLASS-FROM-CELL BUTTON NIL T)

2 个答案:

答案 0 :(得分:5)

您必须将符号导入到您希望其使用的包中。

通用“用户”包是cl-user,“处女”图片会将您带到那里。要从其他包导入(导出)符号,请发出(use-package :another-package)。 REPL上的示例:

(asdf:load-system :ltk)
(use-package :ltk)

有时人们想要使用未导入的符号。然后,您可以在其前面添加包,例如bar:foo,其中bar是包名称,foo是符号。

在真实系统上工作时,通常会为其定义一个或多个包。这是通过defpackage完成的,您可以直接导入其他包:

(defpackage #:my-app
  (:use :cl
        :ltk))

然后,您需要切换到该包:

(in-package #:my-app)

当设置具有多个相互依赖文件的更复杂系统时,系统定义工具变得值得。目前使用最广泛的是ASDF,尽管存在少数替代方案。

答案 1 :(得分:0)

ASDF不会将包加载到COMMON-LISP-USER包中。因此,当前包中未定义WITH-LTK,因此您需要执行以下操作:

(asdf:oos 'asdf:load-op :ltk)
(in-package :ltk)
;put your function here