common-lisp - 为 eval 设置环境(包?)

标签 common-lisp

我想通过 TCP 将 Lisp 表单传输到另一台主机。例如,它是通过

发送的

(prin1 `(setf mypack:*somevar* ,mypack:*somevar*) the-stream)

在另一端,与源端运行相同的程序,因此所有包都存在等等。这个引用的形式是通过eval运行的。 但 'mypack' 被 prin1 忽略,因此在计算时该变量被设置在 'common-lisp-user' 包中。

是否可以定义环境或评估表单的包,以便我可以设置变量或调用函数?

最佳答案

打印带或不带包前缀的符号

CL-USER 11 > (defpackage "FOO" (:USE ) (:export "X1"))
#<The FOO package, 0/16 internal, 1/16 external>

FOO不使用包并导出符号X1

CL-USER 12 > (let ((*package* (find-package "CL-USER")))
               (print 'foo:x1)
               (values))

FOO:X1 

打印时当前包是CL-USER。符号 FOO:X1 在包 CL-USER 中不可访问:它未导入并且包 FOO使用进入CL-USER。因此,符号 X1 与包前缀 FOO 一起打印。由于符号 X1 是从包 FOO 中导出的,因此它会以一个冒号打印为 FOO:X1

对比

CL-USER 13 > (let ((*package* (find-package "FOO")))
               (print 'foo:x1)
               (values))

X1 

上面使 FOO 在打印期间成为当前包。该包中的所有符号都将不带前缀打印。

Common Lisp 标准讨论了符号的打印包前缀

参见CLHS 22.1.3.3.1 Package Prefixes for Symbols .

另请参阅控制打印机的各种变量:CLHS 22.1.1.1 Multiple Possible Textual Representations

关于common-lisp - 为 eval 设置环境(包?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77452237/

相关文章:

pointers - 通用 Lisp CFFI : pointer to the pointer

common-lisp - 如何在 Lisp 中抽象 Mancala 板

common-lisp - 如何摆脱普通 lisp 中的 funcall

Lisp:宏/函数定义中的包前缀问题

search - 如何减少 A* 搜索 8-puzzle 中的长时间执行时间

按部分搜索单词

linux - 无法访问相对于 CANVAS 小部件的鼠标坐标

lisp - 创建一个包含 T 作为单个元素的列表

common-lisp - 在 Common Lisp 中,如何测试变量是否特殊?

optimization - 如何让 SBCL 优化掉对 DEFINITION 的可能调用?