Emacs 为什么是粘液';s";一揽子计划;与下口齿不清不同?

Emacs 为什么是粘液';s";一揽子计划;与下口齿不清不同?,emacs,lisp,common-lisp,slime,Emacs,Lisp,Common Lisp,Slime,我想我并不清楚slime是如何在Emacs中运行lisp的 假设我有一个包含以下条目的文件:- (defpackage "TEST" (:use "COMMON-LISP")) (in-package "TEST") *package* 现在我编译/运行这三个 C-c C-c C-x C-e 我得到了输出:- #<PACKAGE "TEST"> 它给我的输出是 #<PACKAGE "COMMON-LISP-USER"> # 有什么好处?使用上面的slime命

我想我并不清楚slime是如何在Emacs中运行lisp的

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

(defpackage "TEST"
  (:use "COMMON-LISP"))
(in-package "TEST")
*package*
现在我编译/运行这三个

C-c C-c
C-x C-e
我得到了输出:-

#<PACKAGE "TEST">
它给我的输出是

#<PACKAGE "COMMON-LISP-USER">
#

有什么好处?使用上面的slime命令显然可以做些什么,但它似乎不会影响低级lisp的主REPL循环。

文件中的当前包(或缓冲区实际上)是由编译时从编译表单向后搜索时在package表单中找到的第一个顶级
确定的,例如。G当使用
C-C-C
在点处编译顶级表单时。如果不是这样的话,我希望你能想象即将出现的混乱

REPL上的当前包是通过在包中使用
设置的


您可以使用
C-C-~

方便地将当前REPL包和当前目录设置为当前缓冲区的REPL包和当前目录。文件中的当前包(或缓冲区实际上)由编译时从编译表单向后搜索时在包
表单中找到的第一个顶级
确定,例如。G当使用
C-C-C
在点处编译顶级表单时。如果不是这样的话,我希望你能想象即将出现的混乱

REPL上的当前包是通过在包中使用
设置的


您可以使用
C-C-~

全局特殊变量将当前REPL包和当前目录方便地设置为当前缓冲区的那些

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

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"))
线程局部全局特殊变量

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

(sb-thread:make-thread (lambda (*package*)
                                    ...)
                       :arguments (list *package*))
上述线程函数将有自己的
*包*
变量绑定

IDE和globals

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

您还希望编辑器Lisp代码缓冲区中的求值使用该缓冲区中的包(通常是顶部定义的包或代码中最近的
IN-package
中的包)。编辑器还可以将包设置为用于当前Lisp代码缓冲区

然后,IDE将在评估过程中使用类似于上面的内容:重新绑定
*包*
变量和/或在每个线程中使用多个线程及其自己的
*包*
变量绑定

IDE和多个低级LISP


通常只有一个次Lisp,但可能有多个侦听器。某些IDE可能还支持多个次Lisp。

全局特殊变量

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

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"))
线程局部全局特殊变量

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

(sb-thread:make-thread (lambda (*package*)
                                    ...)
                       :arguments (list *package*))
上述线程函数将有自己的
*包*
变量绑定

IDE和globals

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

您还希望编辑器Lisp代码缓冲区中的求值使用该缓冲区中的包(通常是顶部定义的包或代码中最近的
IN-package
中的包)。编辑器还可以将包设置为用于当前Lisp代码缓冲区

然后,IDE将在评估过程中使用类似于上面的内容:重新绑定
*包*
变量和/或在每个线程中使用多个线程及其自己的
*包*
变量绑定

IDE和多个低级LISP


通常只有一个低级Lisp,但可能有多个侦听器。某些IDE可能还支持多个低级Lisp。

我仍然有点困惑。只有一个低级Lisp运行正常?同一实例中的同一全局变量怎么可能有两个不同的值?据我所知*package*是SUPER lispI实例中的一个全局变量。我仍然有点困惑。只有一个SUPER lisp正确运行?同一实例中的同一个全局变量怎么可能有两个不同的值?据我所知*package*是SUPER lisp实例中的一个全局变量,这更有意义!谢谢!这很有意义更有道理!谢谢!