Pregunta

Instalé LTK a Steel Bank Common LISP con Asdf Install, pero ni siquiera puedo comenzar a usarlo V_V. El siguiente código es el ejemplo más simple en la documentación, y se copia casi textualmente.


(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)

Este es el mensaje de error que recibo de 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)
¿Fue útil?

Solución

Debe importar los símbolos en el paquete en el que desea que funcione.

El paquete genérico de "usuario" es cl-user, y una imagen "virgen" te pondrá allí. Para importar los símbolos (exportados) de otro paquete, problema (use-package :another-package). Ejemplo en el repl:

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

A veces uno quiere usar símbolos que no se importen. Luego puede prefijarlos con el paquete, como bar:foo, dónde bar es el nombre del paquete y foo el símbolo.

Cuando trabaje en un sistema real, generalmente definirá uno o más paquetes para él. Esto se hace a través de defpackage, que puede decir qué otros paquetes para importar directamente:

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

Luego, debe cambiar a ese paquete:

(in-package #:my-app)

Al configurar un sistema más complicado con varios archivos interdependientes, una instalación de definición del sistema vale la pena. El actualmente más utilizado es Asdf, aunque existen un puñado de alternativas.

Otros consejos

ASDF no carga un paquete en el paquete de usuarios comunes. Como resultado, con LTK no se define en su paquete actual, por lo que debe hacer esto:

(asdf:oos 'asdf:load-op :ltk)
(in-package :ltk)
;put your function here
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top