Pergunta

Instalei o LTK para o Steel Bank Common Lisp com o ASDF-Install, mas não consigo nem começar a usá-lo V_V. O código abaixo é o exemplo mais simples da documentação e é copiado quase literalmente.


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

Esta é a mensagem de erro que recebo do 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)
Foi útil?

Solução

Você precisa importar os símbolos para o pacote em que deseja que ele funcione.

O pacote genérico de "usuário" é cl-user, e uma imagem "virgem" o colocará lá. Para importar os símbolos (exportados) de outro pacote, emissão (use-package :another-package). Exemplo no repl:

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

Às vezes, alguém quer usar símbolos que não sejam importados. Você pode prefixá -los com o pacote, como bar:foo, Onde bar é o nome do pacote e foo o símbolo.

Ao trabalhar em um sistema real, geralmente você definirá um ou mais pacotes para ele. Isso é feito através defpackage, que você pode dizer que outros pacotes importam diretamente:

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

Então, você precisa mudar para esse pacote:

(in-package #:my-app)

Ao configurar um sistema mais complicado com vários arquivos interdependentes, uma instalação de definição do sistema se torna valiosa. O atualmente mais amplamente utilizado é ASDF, embora existam um punhado de alternativas.

Outras dicas

O ASDF não carrega um pacote no pacote comum-lisp-user. Como resultado, com LTK não está definido no seu pacote atual, então você precisa fazer isso:

(asdf:oos 'asdf:load-op :ltk)
(in-package :ltk)
;put your function here
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top