Проблемы с LTK (Common Lisp)
-
19-09-2019 - |
Вопрос
Я установил 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)
Решение
Вы должны импортировать символы в пакет, в котором вы хотите, чтобы он работал.
Общий пакет «пользователя» 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, хотя существует горстка альтернатив.
Другие советы
ASDF не загружает упаковку в пакет обыкновенного пользователя. В результате, с LTK не определен в вашем текущем пакете, поэтому вам нужно сделать это:
(asdf:oos 'asdf:load-op :ltk)
(in-package :ltk)
;put your function here