我想通过 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/