2010-03-14 103 views
7

我使用asdf-install將ltk安裝到Steel Bank Common Lisp,但我甚至無法開始使用它V_V。下面的代碼是文檔中最簡單的例子,幾乎是逐字拷貝的。ltk(common lisp)的問題


(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) 
+0

缺失(第一行只是複製和粘貼錯誤?)(我認爲是這樣) –

+0

呃..是的,謝謝 – Silvanus

回答

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,儘管存在少數幾種替代方案。

+0

IIRC ltk定義了包ltk-user來運行演示程序。 – PuercoPop

0

ASDF不包加載到COMMON-LISP-USER包。其結果是,WITH-LTK沒有在當前的包中定義的,所以你需要這樣做:

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

我不會推薦在庫包中工作 – Svante

+0

@Svante:啊,現在我看到你的答案:) –