gpt4 book ai didi

emacs - 为什么 slime 的 "package"和劣等的 lisp 不一样?

转载 作者:太空宇宙 更新时间:2023-11-03 18:56:08 26 4
gpt4 key购买 nike

我想我对 slime 如何在 Emacs 中运行 lisp 还没有一个清晰的认识。

假设我有一个包含以下条目的文件:-

(defpackage "TEST"
(:use "COMMON-LISP"))
(in-package "TEST")
*package*

现在我用 say 中的任何一个编译/运行这三个

C-c C-c
C-x C-e

我得到了输出:-

#<PACKAGE "TEST">

但是,如果我现在将缓冲区切换到劣质 lisp 缓冲区并键入

*package*

它给我的输出是

#<PACKAGE "COMMON-LISP-USER">

什么给了?使用上面的 slime 命令显然做了一些事情,但它似乎并没有影响 inferior-lisp 的主 REPL 循环。

最佳答案

全局特殊变量

由于全局变量使用动态绑定(bind),因此可以重新绑定(bind)它们:

CL-USER> *package*
#<The COMMON-LISP-USER package, 117/256 internal, 0/4 external>
CL-USER> (defpackage "TEST"
(:use "COMMON-LISP"))
#<The TEST package, 0/16 internal, 0/16 external>
CL-USER> (let ((*package* (find-package "TEST")))
(intern "FOO"))

所以你不需要设置全局变量,你可以重新绑定(bind)它们。

所以像 SLIME 这样的东西可以重新绑定(bind)它们并在反弹变量绑定(bind)中执行评估代码:

(let ((*package* (find-package "FOO")))
(eval (read-from-string some-string-with-code)))

线程局部全局特殊变量

也可以创建线程,这样它们就有自己的“线程本地”全局变量:

(sb-thread:make-thread (lambda (*package*)
...)
:arguments (list *package*))

以上线程函数将有自己的*package*变量绑定(bind)。

IDE 和全局变量

通常人们会希望 IDE 在当前监听器线程中使用全局变量(每个监听器线程都应该有自己的全局变量)。

人们还希望来自编辑器的评估 Lisp 代码缓冲区使用来自该缓冲区的包(通常是顶部定义的包或代码中最近的 IN-PACKAGE 的包。编辑器也可以设置包以用于当前的 Lisp 代码缓冲区。

然后 IDE 将在评估期间使用类似上面的内容:重新绑定(bind) *package* 变量和/或使用多个线程,每个线程都有自己的 *package* 变量绑定(bind)线程。

IDE 和多个劣质 Lisp

通常只有一个较差的 Lisp,但可能有多个听众。一些 IDE 可能还支持不止一种劣质 Lisp。

关于emacs - 为什么 slime 的 "package"和劣等的 lisp 不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51090460/

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