Проблемы с ltk (common lisp)

Я установил ltk в Steel Bank Common Lisp с помощью asdf-install, но я даже не могу начать его использовать 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)

person Silvanus    schedule 14.03.2010    source источник
comment
Отсутствует (в первой строке просто ошибка копирования и вставки? (Я так полагаю.)   -  person Frank Shearar    schedule 14.03.2010


Ответы (2)


Вы должны импортировать символы в пакет, в котором вы хотите, чтобы они работали.

Общий «пользовательский» пакет — cl-user, и «девственный» образ поместит вас туда. Чтобы импортировать (экспортированные) символы из другого пакета, введите (use-package :another-package). Пример на REPL:

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

Иногда хочется использовать символы, которые не импортируются. Затем вы можете добавить к ним префикс пакета, например bar:foo, где bar — имя пакета, а foo — символ.

При работе с реальной системой вы обычно определяете для нее один или несколько пакетов. Это делается через defpackage, по которому вы можете указать, какие другие пакеты импортировать напрямую:

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

Затем вам нужно переключиться на этот пакет:

(in-package #:my-app)

При настройке более сложной системы с несколькими взаимозависимыми файлами становится полезной возможность определения системы. В настоящее время наиболее широко используется ASDF, хотя существует несколько альтернатив.

person Svante    schedule 14.03.2010
comment
IIRC ltk определяет пакет ltk-user для запуска демонстраций. - person PuercoPop; 17.02.2014

ASDF не загружает пакет в пакет COMMON-LISP-USER. В результате WITH-LTK не определен в вашем текущем пакете, поэтому вам нужно сделать следующее:

(asdf:oos 'asdf:load-op :ltk)
(in-package :ltk)
;put your function here
person Frank Shearar    schedule 14.03.2010
comment
@Svante: А, теперь я вижу твой ответ :) - person Frank Shearar; 14.03.2010