Problemi con LTK (Common Lisp)
-
19-09-2019 - |
Domanda
Ho installato LTK Steel Bank Common Lisp con asdf-installazione, ma non può nemmeno iniziare ad usarlo v_v. Il codice che segue è l'esempio più semplice nella documentazione, e viene copiato quasi alla lettera.
(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)
Questo è il messaggio di errore che ricevo da 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)
Soluzione
È necessario importare i simboli nel pacchetto che si desidera lavorare in.
Il generico pacchetto "utente" è cl-user
, e un'immagine di "vergine" vi metterà lì. Al fine di importare i simboli (esportati) da un altro pacchetto, tema (use-package :another-package)
. Esempio sul REPL:
(asdf:load-system :ltk) (use-package :ltk)
A volte si vuole utilizzare simboli che non vengono importati. È quindi possibile prefisso con il pacchetto, come bar:foo
, dove bar
è il nome del pacchetto e foo
il simbolo.
Quando si lavora su un sistema reale, di solito definire uno o più pacchetti per esso. Questo viene fatto attraverso defpackage
, che si può dire ciò che altri pacchetti di importare direttamente:
(defpackage #:my-app (:use :cl :ltk))
Quindi, è necessario passare a quel pacchetto:
(in-package #:my-app)
Quando si imposta un sistema più complicato con diversi file interdipendenti, un impianto di definizione del sistema diventa utile. Attualmente più usato è ASDF , anche se una manciata di alternative esistenti.
Altri suggerimenti
ASDF non viene caricato un pacchetto nel pacchetto COMMON LISP-USER. Di conseguenza, CON-LTK non è definita nel pacchetto corrente, quindi è necessario fare questo:
(asdf:oos 'asdf:load-op :ltk)
(in-package :ltk)
;put your function here