Правильный способ определения пакетов с использованием asdf :defsystem и quickproject

Я новичок в Лиспе, пытаюсь понять, как правильно использовать систему пакетов Лиспа, изучая LTK для программирования с графическим интерфейсом, используя SBCL 1.0.55.0.debian и Limp 0.3.4 (и Debian Wheezy, если это имеет значение ). Я установил ASDF с помощью диспетчера пакетов aptitude (пакетов cl -asdf & cl -common -lisp -контроллера ), затем я установил Quicklisp, используя инструкции на веб-сайте Quicklisp (http://www.quicklisp.org/beta/index.html)(, а не из Репозиторий Debian ), а затем я установил LTK с (ql:quickload 'ltk)в консоли SBCL.

hello -1.lisp (непосредственно из руководства по LTK):

(defun hello-1()
    (with-ltk ()
              (let ((b (make-instance ’button
                                      :master nil
                                      :text "Press Me"
                                      :command (lambda ()
                                                       (format t "Hello World!~&")))))
                   (pack b))))

Если я скомпилирую это прямо в новом образе SBCL Lisp, я получу сообщение о том, что WITH-LTKи PACKявляются неопределенными функциями и 'BUTTON— неопределенная переменная.

Итак, я обнаружил, что мне нужно сначала загрузить 'ltk, а затем использовать in-package. Чтобы запустить его, мне сначала нужно использовать (ql:quickload 'ltk)и (in-package :ltk)в консоли SBCL. Тем не менее, я все еще получаю сообщение об ошибке, что 'BUTTONявляется неопределенной переменной.

* (ql:quickload 'ltk)
To load "ltk":
  Load 1 ASDF system:
    ltk
; Loading "ltk"

(LTK)
* (in-package :ltk)

#
* (compile-file "/home/user/code/lisp/hello-1.lisp")

; caught WARNING:
;   undefined variable: ’BUTTON
; 
; compilation unit finished
;   Undefined variable:
;     ’BUTTON
;   caught 1 WARNING condition

; /home/user/code/lisp/hello-1.fasl written
; compilation finished in 0:00:00.009
#P"/home/user/code/lisp/hello-1.fasl"
T
T
* 

Затем, поскольку это не сработало так, как я хотел,Я также попытался определить свои собственные определения пакетов в соответствии с ответами на другой вопрос(Проблемы с ltk (common lisp)), запись в блоге Xach «Создание небольшого проекта Lisp с помощью quickproject и Quicklisp»http://xach.livejournal.com/278047.html?thread=674335и ASDF Вручную(http://common-lisp.net/project/asdf/asdf/The-defsystem-form.html)с помощью quickproject:make-project, но безуспешно. В настоящее время у меня есть следующие файлы:

package.lisp (компилируется чисто, если я сначала (ql:quickload 'ltk)SBCL REPL):

(defpackage :hello-world-ltk-system 
  (:use :cl :asdf :ltk))

hello -world -ltk.asd (компилируется чисто после того, как я впервые скомпилировал пакет.lisp):

(in-package :hello-world-ltk-system)
(asdf:defsystem :hello-world-ltk
  :serial t
  :description "Describe hello-world-ltk here"
  :author "Your Name "
  :license "Specify license here"
  :depends-on (:cl :asdf :ltk)
  :components ((:file "package")
            (:file "hello-world-ltk")))

hello -world -ltk.lisp (Я получаю ошибку компиляцииThe name "HELLO-WORLD-LTK" does not designate any package).

(require 'hello-world-ltk)
(in-package :hello-world-ltk)
(defun hello-world-1 () 
  (with-ltk () 
            (let ((b (make-instance 'button 
                                    :master nil 
                                    :text "Press me!" 
                                    :command (lambda () 
                                                     (format t "Hello world!~&"))))) 
                 (pack b))))          

Когда я пытаюсь скомпилировать этот hello -world -ltk.lisp после успешной компиляции package.lisp и hello -world -ltk.asd (, которые все находятся в одном каталоге )Я получаю следующую ошибку:

; compiling (IN-PACKAGE :HELLO-WORLD-LTK)
debugger invoked on a SB-KERNEL:SIMPLE-PACKAGE-ERROR in thread
#:
  The name "HELLO-WORLD-LTK" does not designate any package.

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-INT:%FIND-PACKAGE-OR-LOSE "HELLO-WORLD-LTK")
0]
(load "/home/user/code/lisp/hello-world-ltk/hello-world-ltk")

debugger invoked on a SIMPLE-ERROR in thread
#:
  attempt to load an empty FASL file:
  "/home/user/code/lisp/hello-world-ltk/hello-world-ltk.fasl"

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Reduce debugger level (to debug level 1).
  1:         Exit debugger, returning to top level.

(SB-FASL::LOAD-AS-FASL
 #
 NIL
 #)
0[2]

Итак, я совершенно потерялся здесь со всеми различными способами определения пакетов, ASDF, Quicklisp, package.lisp, quickproject, asdf:defsystem, requireи ql:quickload.., quickproject:make-projectвыглядит многообещающе, но я действительно не знаю, что еще не так с моими исходными файлами. Я ищу решение, которое должно обрабатывать все компиляции и загрузки пакетов предпочтительно в одной команде для всего проекта, а также должно быть расширяемым для более крупных проектов.

Спасибо за помощь:)

7
задан Community 23 May 2017 в 12:33
поделиться