gpt4 book ai didi

debian - 在 Debian 上使用 SLIME 在 Common Lisp 中加载外部包

转载 作者:行者123 更新时间:2023-12-05 01:28:15 30 4
gpt4 key购买 nike

我在 Debian 挤压上使用 SBCL 1.0.56,带有 cl-swank/slime
1:20120420-2(Debian 版本号)。这些都是目前的
版本不稳定。

我在加载第三方 CL 包时遇到问题。这
在 Debian 上使用 CL 的文档(实际上是更通用的 CL
Linux 上的使用文档)是粗略的、矛盾的,并且
过时了,所以我将总结我所知道的。这就是我所在的地方。

Debian 将二进制包(例如 cl-split-sequence)安装在/usr/share/common-lisp/source .在 split 序列的情况下,这是/usr/share/common-lisp/source/cl-split-sequence .

.asd 文件(这里/usr/share/common-lisp/source/cl-split-sequence/split-sequence.asd ),
据我了解,它为 CL 实现提供了说明
关于版本和依赖项,看起来像

;;; -*- Lisp -*- mode
(defpackage #:split-sequence-system (:use #:cl #:asdf))
(in-package :split-sequence-system)

(defsystem :split-sequence
:version "20011114.1"
:components ((:file "split-sequence")))

现在,在运行 slime 时,在 REPL 处输入以下两行
工作没有问题
(require :split-sequence)
(split-sequence:SPLIT-SEQUENCE #\, "foo,bar")
(require :split-sequence)调用(我认为)的内置副本
SBCL 内的 ASDF,大概是 split-sequence.asd .这个
可能是特定于 SBCL 的,参见 Common Lisp in Debian Manual Chapter 3 -Libraries .
值得一提的是,这个页面,既实用又详细
我遇到的任何事情,都会经常提到 CLC(常见的
Lisp Controller ),但 Debian 似乎正在远离这一点。看
Redesign of Common LispController ,
我不完全理解。无论如何,没有任何记录在案
使用 CLC 的命令对我有用。但是,CLC 仍然可用
在 Debian 上。此外,用户邮件列表已死 - 见 The Clc-usersArchives

第一次 (require :split-sequence)被调用,被编译,
和(在我的系统上,可能是特定于 Debian 的)结果 fasl
放在
~/.cache/common-lisp/sbcl-1.0.56.0.debian-linux-x86/usr/share/common-lisp/source/cl-split-sequence/split-sequence.fasl
IE。该文件被放置在一个文件系统的缓存下,镜像
原始来源的位置。显而易见的问题是,如何
系统知道去哪里找包吗?这是我不是的一件事
确信。看起来搜索路径应该在 /etc/common-lisp/source-registry.conf.d ,这是 ASDF 的一部分
Debian 软件包,但最接近的是 01-common-lisp-controller.conf ,这只是
(:directory  #p"/usr/share/common-lisp/systems/")

也许这在某个地方是硬连线的,但我想知道。

反正这个ASDF文件一旦进入缓存,就不会再编译了,
但是 REPL 在 Slime 启动后看不到它,除非有人这样​​做 require再次。

现在,如果我把线条
(require :split-sequence)
(split-sequence:SPLIT-SEQUENCE #\, "foo,bar")

在文件中,说 seq.lisp ,然后用 C-c C-k 将它加载到 REPL 中,我得到
错误和回溯,从
The name "SPLIT-SEQUENCE" does not designate any package.
[Condition of type SB-KERNEL:SIMPLE-PACKAGE-ERROR]

所以我得出结论,这个包没有被正确加载。我尝试过类似的变化
(asdf:oos 'asdf:load-op :split-sequence)


(asdf:load-system :split-sequence)

但没有骰子。奇怪的是,假设我们只有这条线
(require :split-sequence)

在文件中 - 调用此 require.lisp为了清楚起见。然后加载 require.lisp没有给出错误,然后输入
(split-sequence:SPLIT-SEQUENCE  #\, "foo,bar")

在 REPL 工作!但是,没有加载 require.lisp , 键入
前一行在 REPL 中不起作用。

因此,总而言之,如何成功地将包加载到
脚本?我也对上面提到的问题感兴趣,关于
ASDF 如何找到 /usr/share/common-lisp/source/位置,但
这更像是一个附带问题。

最佳答案

C-c C-k 编译源文件,然后加载编译后的文件。

Lisp 源文件包含定义和调用。文件编译器遍历文件并为其创建代码。但它不执行它。

如果您的文件包含对 REQUIRE 的调用,在编译期间不执行。如果稍后加载编译的文件,它将被执行。如果文件中的下一个 Lisp 表单正在使用一些在调用 REQUIRE 后可用的包。 ,它只是在编译期间不存在,因为 REQUIRE尚未执行 - 因此在编译时读取过程中出现错误。

基本上有两种解决方案:

  • 执行所有必要的 REQUIRE在使用所需功能编译特定文件之前执行操作。
  • 执行 REQUIRE编译时声明。那就是EVAL-WHEN :COMPILE-TOPLEVEL告诉 compile 在编译期间执行子窗体。
  • #+:sbcl(foo)表示 (foo) 仅在 :SBCL 时被读取是列表中的符号 CL:*FEATURES* .使用它是为了让编译器仅在它是 SBCL 时才能看到此代码。

    Common Lisp 代码的编译需要更加仔细地准备,因为:
  • 可以在文件编译期间执行 Lisp 代码,从而改变文件编译器的行为。
  • 源代码中使用的包(符号的命名空间)需要为文件编译器的阅读器所知。
  • 关于debian - 在 Debian 上使用 SLIME 在 Common Lisp 中加载外部包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10543906/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com