2010-03-14 16 views
7

Ho installato ltk su Steel Bank Common Lisp con asdf-install, ma non riesco nemmeno ad usarlo V_V. Il seguente codice è l'esempio più semplice nella documentazione e viene copiato quasi alla lettera.Problemi con 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) 

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

è il giusto un errore di copia & incolla mancanti (nella prima riga (presumo così) –

+0

Ehm .. sì, era, grazie – Silvanus

risposta

5

È necessario importare i simboli nel pacchetto che si desidera farlo funzionare in

Il pacchetto generico "utente" è cl-user e un'immagine "vergine" ti metterà lì. Per importare i simboli (esportati) da un altro pacchetto, emettere (use-package :another-package). Esempio su REPL:

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

A volte si desidera utilizzare simboli non importati. È quindi possibile aggiungere loro il prefisso con il pacchetto, ad esempio bar:foo, dove bar è il nome del pacchetto e foo il simbolo.

Quando si lavora su un sistema reale, di solito si definiscono 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, una funzione di definizione del sistema diventa utile. Il più utilizzato attualmente è il ASDF, sebbene esistano poche alternative.

+0

IIRC ltk definisce il pacchetto ltk-user per eseguire le demo in. – PuercoPop

0

ASDF non viene caricato un pacchetto nel pacchetto COMMON-LISP-UTENTE. 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 
+0

io non consiglierei a lavorare nel pacchetto libreria – Svante

+0

@Svante:?.. Ah, e ora vedo la tua risposta :) –