煤泥的“包装”为何与下口脂不同?

时间:2018-06-28 20:01:33

标签: emacs lisp common-lisp slime

我认为我对Emacs中的粘液如何运行Lisp尚无明确的认识。

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

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

现在我可以说/编译这三个文件

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

然后我得到输出:-

#<PACKAGE "TEST">

但是,如果我现在将缓冲区切换到下级Lisp缓冲区并输入

*package*

它给我的输出为

#<PACKAGE "COMMON-LISP-USER">

有什么作用?显然,使用上面的slime命令可以执行某些操作,但似乎不会影响下层lisp的主REPL循环。

2 个答案:

答案 0 :(得分:4)

全局特殊变量

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

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"))

因此您不需要设置全局变量,可以重新绑定它们。

SLIME之类的东西可以重新绑定它们,并在反弹变量绑定内执行代码以进行评估:

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

线程局部全局特殊变量

还可以创建线程,以便它们具有自己的“本地线程”全局变量:

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

以上线程函数将具有其自己的*package*变量绑定。

IDE和全局变量

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

还希望编辑器的Lisp代码缓冲区的评估使用该缓冲区中的包(通常是在代码中位于顶部的包或最接近的IN-PACKAGE的包。编辑器也可以设置要用于当前Lisp代码缓冲区的软件包。

然后,IDE将在评估过程中使用与上面类似的方法:重新绑定*package*变量和/或在每个线程中使用具有各自的*package*变量绑定的多个线程。

IDE和多个下颌骨

通常只有一个下Lisp,但是可能有多个侦听器进入其中。某些IDE可能还支持多个下Lisp。

答案 1 :(得分:2)

文件(或实际上是缓冲区)中的当前包由在编译时从已编译表单向后搜索时找到的第一个顶级in-package表单确定。 G。使用C-c C-c编译点的顶层表单时。我希望您能想象如果没有的话,迫在眉睫的困惑。

通过使用in-package在REPL上设置当前软件包。

您可以使用C-c C-~方便地将当前REPL软件包和当前目录设置为当前缓冲区的内容。