无法在 common-lisp SBCL 中设置 qtools

Can't set up qtools in 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" 没有被任何带有 quickload 的安装包提供? 这是已安装软件包的列表 $ ls ~/.quicklisp/dists/quicklisp/software

感谢帮助

我的资源:

https://github.com/Shinmera/qtools

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

您需要安装qtools系统。

  • 系统是组织软件库的一种方式
  • 一个包就是一个命名空间

两者理论上没有关联。但是通常,当您加载系统 X 时,它会定义一个名为 X 的包。

在某些情况下(如qtools)一个系统有多个包,例如因为系统要定义不同级别的API.

加载一个系统时定义多个包的另一种方法来自 ASDF version 3.1 supports an extension copied from other build systems named package-inferred-systems,其中每个源文件都隐式映射到一个系统和一个包。

这是安装 qtools 时 Quicklisp 显示的片段:

* (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 定义的包 本身。这里qtoolscl+qt都是qtools系统定义的包。

包没有在系统中声明,因此您需要依靠文档来了解系统定义了哪些包。

我们来看例子。动作顺序为:

  • 编译 .asd 文件(例如,使用 C-c C-k)。这将创建 qtools-helloworld system.
  • 加载 "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 所需的步骤ps 是:

  • 加载 asd 定义:rlwrap sbcl --load qtools-helloworld.asd。 (rlwrap 只是一个 readline 实用程序)
  • 您已进入 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)
  • 它没有显示 GUI。我们将调用 main 函数:

    • (qtools-helloworld::main)

你应该看到这个例子。如果您对 lisp 文件进行了更改,则可以重新加载它。在终端中使用 REPL 是可行的,但不像 Lisp 那样具有交互性(远非如此)。您希望您的编辑器连接到 REPL 并通过按键自动发送更改。

查看 Cookbook 的编辑部分,SLIMA 对 Atom 的支持非常好。

ps:我觉得Qtools有点难,通过了运行提供的例子。它不像其他 GUI(如 Ltk 或 IUP)那样容易被发现。希望你能证明我是错的。

pps: 也 https://lispcookbook.github.io/cl-cookbook/gui.html#qt4