我安装LTK对钢银行Common Lisp的与ASDF安装,但我不能,甚至开始使用它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)
有帮助吗?

解决方案

您必须将符号导入到你想让它在工作包。

在通用的“用户”包是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 时,尽管其他方案的少数存在。

其他提示

ASDF不包加载到COMMON-LISP-USER包。其结果是,WITH-LTK没有在当前的包中定义的,所以你需要做的:

(asdf:oos 'asdf:load-op :ltk)
(in-package :ltk)
;put your function here
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top