Question

J'ai installé LTK Steel Bank Common Lisp avec asdf-installer, mais je ne peux même commencer à l'utiliser v_v. Le code ci-dessous est l'exemple le plus simple dans la documentation, et est copié presque mot pour mot.


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

Ceci est le message d'erreur que je reçois 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)
Était-ce utile?

La solution

Vous devez importer les symboles dans le paquet que vous voulez travailler.

Le paquet « utilisateur » générique est cl-user, et une image « vierge » vous y mettre. Pour importer les symboles d'un autre paquet (exportés), numéro (use-package :another-package). Exemple sur le REPL:

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

Parfois, on veut utiliser des symboles qui ne sont pas importés. Vous pouvez ensuite les préfixe avec le paquet, comme bar:foo, où bar est le nom du package et foo le symbole.

Lorsque vous travaillez sur un système réel, vous définirez généralement un ou plusieurs paquets pour elle. Cela se fait par defpackage, que vous pouvez dire ce que d'autres paquets d'importer directement:

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

Ensuite, vous devez passer à ce paquet:

(in-package #:my-app)

Lors de la mise en place d'un système plus complexe avec plusieurs fichiers interdépendants, une installation de définition du système devient utile. Le moment le plus utilisé est ASDF , même si une poignée d'alternatives existent.

Autres conseils

ASDF ne charge pas un paquet dans le package Common Lisp-USER. En conséquence, AVEC-LTK est pas défini dans votre forfait actuel, vous devez donc faire ceci:

(asdf:oos 'asdf:load-op :ltk)
(in-package :ltk)
;put your function here
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top