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)
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top