7

asdf-installを使用してltkをSteelBankCommon Lispにインストールしましたが、V_Vで使用を開始することさえできません。以下のコードは、ドキュメントの最も単純な例であり、ほぼ逐語的にコピーされています。


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

これは私が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)
4

2 に答える 2

5

シンボルを機能させたいパッケージにインポートする必要があります。

一般的な「ユーザー」パッケージはcl-userであり、「バージン」イメージがそこに表示されます。別のパッケージから(エクスポートされた)シンボルをインポートするには、を発行し(use-package :another-package)ます。REPLの例:

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

インポートされていないシンボルを使用したい場合があります。次に、のようbar:fooにパッケージのプレフィックスを付けることができます。ここbarで、はパッケージ名とfoo記号です。

実際のシステムで作業する場合、通常は1つ以上のパッケージを定義します。これはdefpackage、を介して実行されます。これにより、他にどのパッケージを直接インポートするかを指定できます。

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

次に、そのパッケージに切り替える必要があります。

(パッケージ内#:my-app)

複数の相互依存ファイルを含むより複雑なシステムをセットアップする場合、システム定義機能は価値があります。現在最も広く使用されているのはASDFですが、いくつかの選択肢があります。

于 2010-03-14T20:38:24.463 に答える
0

ASDFはパッケージをCOMMON-LISP-USERパッケージにロードしません。その結果、WITH-LTKは現在のパッケージで定義されていないため、次のようにする必要があります。

(asdf:oos 'asdf:load-op :ltk)
(in-package :ltk)
;put your function here
于 2010-03-14T20:27:37.513 に答える