2010-03-14 14 views
7

Ich habe ltk zu Steel Bank Common Lisp mit asdf-install installiert, aber ich kann nicht einmal anfangen, es V_V zu verwenden. Der folgende Code ist das einfachste Beispiel in der Dokumentation und wird fast wörtlich kopiert.Probleme mit 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) 

Dies ist die Fehlermeldung, die ich von sbcl erhalten:


> ; 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

Sind die (in der ersten Zeile nur eine Copy & Paste-Fehler fehlen (ich nehme an so) –

+0

Er .. ja, es war dank – Silvanus

Antwort

5

Sie haben die Symbole in das Paket importieren Sie es wollen arbeiten

Das generische "user" -Paket ist cl-user, und ein "virgin" -Bild wird Sie dorthin bringen. Um die (exportierten) Symbole aus einem anderen Paket zu importieren, geben Sie (use-package :another-package) aus. Beispiel für die REPL:

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

Manchmal möchte man Symbole verwenden, die nicht importiert werden. Sie können ihnen dann das Paket voranstellen, z. B. bar:foo, wobei bar der Paketname und foo das Symbol ist.

Wenn Sie an einem realen System arbeiten, definieren Sie normalerweise ein oder mehrere Pakete dafür. Erreicht wird dies durch defpackage getan, was man kann sagen, welche anderen Pakete direkt importieren:

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

Dann Sie zu diesem Paket wechseln müssen:

(in-package #:my-app)

Wenn ein komplizierteres System mit mehreren Einrichten interdependenten Dateien wird eine Systemdefinitionseinrichtung sinnvoll. Die derzeit am weitesten verbreitete ist ASDF, obwohl eine Handvoll Alternativen existieren.

+0

IIRC ltk definiert das Paket ltk-user, um die Demos zu starten. – PuercoPop

0

ASDF lädt kein Paket in das COMMON-Lisp-USER-Paket. Als Ergebnis MIT-LTK ist in Ihrem aktuellen Paket definiert, so müssen Sie dies tun.

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

Ich würde Arbeit in der Bibliothek Paket nicht empfehlen – Svante

+0

@Svante:.. Ah, und jetzt sehe ich deine Antwort :) –