我认为我对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循环。
答案 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软件包和当前目录设置为当前缓冲区的内容。