Не могу настроить qtools в Common-Lisp SBCL

Я новичок в lisp и не могу понять, как правильно использовать defpackage для загрузки qtools (в Arch Linux). Для простоты, если я запускаю этот пример проекта в sbcl с загруженным quicklisp https://github.com/Shinmera/qtools/tree/master/examples/helloworld появляется эта ошибка

While evaluating the form starting at line 8, column 0
  of #P"/home/william/code/upol/lisp/helloworld/helloworld.lisp":

debugger invoked on a PACKAGE-DOES-NOT-EXIST in thread
#<THREAD "main thread" RUNNING {1000508083}>:
  The name "CL+QT" does not designate any package.

Почему "cl+qt" не предоставляется ни одним из установленных пакетов с быстрой загрузкой? Вот список установленных пакетов $ ls ~/.quicklisp/dists/quicklisp/software

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

Мои ресурсы:

https://github.com/Shinmera/qtools

https://lispcookbook.github.io/cl-cookbook/getting-started.html


person W. Smith    schedule 10.04.2020    source источник


Ответы (2)


Давайте посмотрим на пример. Порядок действий такой:

  • скомпилируйте файл .asd (например, с C-c C-k). Это создает систему qtools-helloworld.
  • загрузите «qtools-helloworld» и его зависимости с помощью Quicklisp: (ql:quickload :qtools-helloworld).
  • скомпилируйте helloworld.lisp (опять же, с C-c C-k) и вызовите его функции.

Также посмотрите ридми Qtools: https://github.com/Shinmera/qtools#qtools-1 Он говорит установить эти 3 библиотеки:

(ql:quickload '(qtools qtcore qtgui))

Пакет cl+qt предоставляется одной из этих систем.

обновление: шаги, необходимые для запуска helloworld из командной строки:

  • загрузить определение asd: rlwrap sbcl --load qtools-helloworld.asd. (rlwrap — это просто утилита для чтения)
  • вы попадаете в Lisp REPL. Теперь мы устанавливаем зависимости с Quicklisp, которые вы должны были установить в первую очередь. Вы вводите это в Lisp REPL: (ql:quickload :qtools-helloworld). Это имя определено в файле asd.
  • теперь вы можете скомпилировать файл .lisp: (load "helloworld.lisp):
* (ql:quickload :qtools-helloworld)
To load "qtools-helloworld":
  Load 1 ASDF system:
    qtools-helloworld
; Loading "qtools-helloworld"
[package qtools-helloworld]....
(:QTOOLS-HELLOWORLD)
  • он не показывал графический интерфейс. Мы вызовем функцию main:

    • (qtools-helloworld::main)

и вы должны увидеть пример. Если вы вносите изменения в файл lisp, вы можете загрузить его снова. Такое использование REPL в терминале работает, но не так интерактивно, как Lisp (это далеко не так). Вы хотите, чтобы ваш редактор был подключен к REPL и автоматически отправлял изменения нажатием клавиши.

Загляните в Cookbook, раздел Editors, SLIMA очень хорошо поддерживает Atom.

ps: я нахожу Qtools немного сложным, я прошел приведенные примеры. Его не так легко обнаружить, как другие графические интерфейсы (например, Ltk или IUP). Надеюсь, вы докажете, что я ошибаюсь.

pps: также https://lispcookbook.github.io/cl-cookbook/gui.html#qt4

person Ehvince    schedule 10.04.2020
comment
Что ж, возможно, я ошибаюсь больше, чем думал. Я использую текстовый редактор Geany для lisp. До сих пор я не компилировал ни одной программы на lisp. Я запускаю файлы foo.lisp в bash, например, sbcl --load foo.lisp для тестирования. Интерпретатор выполнен (ql:quickload '(qtools qtcore qtgui)) успешно. Должен ли я запускать свои сценарии с помощью bash по-другому? Должен ли я компилировать (C-c C-k) qtools-helloworld.asd, если я хочу интерпретировать helloworld.lisp вместо его компиляции? - person W. Smith; 10.04.2020
comment
Если вы запустите только sbcl --load helloworld.lisp, вы получите сообщение об ошибке, что cl+qt does not designate any package. Я обновляю свой ответ. - person Ehvince; 10.04.2020
comment
Спасибо за это объяснение. Это именно то, что я искал. Новичку нелегко понять эту систему проектов. Обязательно попробую Атом. - person W. Smith; 10.04.2020
comment
Пожалуйста. Это не кажется легким, но мы можем провести параллели с другими системами. Python: файл setup.py (.asd), который мы устанавливаем локально (setup.py install или pip -e ., быстро загружаем систему, указанную в asd), мы хотим установить его зависимости (pip, ql:quickload) и запускаем (или импортируем одну функцию из библиотеки и пробуем в REPL). - person Ehvince; 10.04.2020

Вам необходимо установить систему qtools.

  • Система — это способ организации программных библиотек.
  • Пакет — это пространство имен

Теоретически они не связаны. Но часто, когда вы загружаете систему X, она определяет пакет с именем X.

В некоторых случаях (например, qtools) существует много пакетов для одной системы, например, потому что система хочет определить разные уровни API.

Другой способ определения нескольких пакетов при загрузке одной системы связан с тем, что ASDF версии 3.1 поддерживает расширение, скопированное из других систем сборки с именем package-inferred-systems, где каждый исходный файл неявно сопоставляется с одной системой и одним пакетом.

Вот фрагмент того, что показывает Quicklisp при установке qtools:

* (ql:quickload :qtools)
To load "qtools":
  Load 14 ASDF systems:
    array-utils asdf bordeaux-threads cffi cl-ppcre
    closer-mop dissect documentation-utils form-fiddle
    named-readtables qt+libs trivial-features
    trivial-garbage trivial-indent

... ... ...

To load "qtools":
  Load 1 ASDF system:
    qtools
; Loading "qtools"
[package uiop/package]............................
..................................................
[package cffi-sys]................................
[package cffi]....................................
..................................................
[package cffi-features]...........................
[package qt-libs].................................
[package qt]......................................
..................................................
[package deploy]..................................
[package dissect].................................
[package simple-tasks]............................
[package trivial-main-thread].....................
[package qtools]..................................
[package cl+qt]...................................
.............................
(:QTOOLS)

Quicklisp может перехватывать и печатать новые пакеты, когда они определены. Здесь выше мы видим, что при загрузке quicklisp определено несколько пакетов: либо (1) пакеты, определенные зависимостями qtools, либо (2) пакеты, определенные самим qtools . Здесь и qtools, и cl+qt являются пакетами, определенными системой qtools.

Пакеты не объявляются в системах, поэтому вам нужно полагаться на документацию, чтобы узнать, какие пакеты определяет система.

person coredump    schedule 10.04.2020