Frage

Ich habe LTK in Stahlbank Common Lisp mit ASDF-Installation installiert, aber ich kann es nicht einmal mit der Verwendung von V_V anfangen. Der folgende Code ist das einfachste Beispiel in der Dokumentation und wird fast wörtlich kopiert.


(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 erhalte:


> ; 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)
War es hilfreich?

Lösung

Sie müssen die Symbole in das Paket importieren, in dem es funktioniert.

Das generische "Benutzer" -Paket ist cl-user, und ein "jungfräuliches" Bild wird dich dorthin bringen. Um die (exportierten) Symbole aus einem anderen Paket zu importieren (use-package :another-package). Beispiel zur Wiederholung:

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

Manchmal möchte man Symbole verwenden, die nicht importiert werden. Sie können sie dann mit dem Paket vorfixieren, wie bar:foo, wo bar ist der Paketname und foo das Symbol.

Wenn Sie an einem realen System arbeiten, definieren Sie normalerweise ein oder mehrere Pakete dafür. Dies geschieht durch defpackage, was Sie erkennen können, welche anderen Pakete direkt importieren sollen:

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

Dann müssen Sie zu diesem Paket wechseln:

(in-package #:my-app)

Bei der Einrichtung eines komplizierteren Systems mit mehreren voneinander abhängigen Dateien lohnt sich eine Systemdefinitionsfunktion. Das derzeit am häufigsten verwendete ist ASDF, obwohl eine Handvoll Alternativen existieren.

Andere Tipps

ASDF lädt ein Paket nicht in das Common-LISP-User-Paket. Infolgedessen ist mit LTK nicht in Ihrem aktuellen Paket definiert, daher müssen Sie dies tun:

(asdf:oos 'asdf:load-op :ltk)
(in-package :ltk)
;put your function here
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top