你不能在 Lisp 中“合并符号”。
首先,5 不是一个符号,而是一个数字。如果您想要一个名为 "5" 的符号,则必须将其键入为 |5|(例如)。
如果函数采用符号A 和符号|5|,并产生符号A5,则它没有合并符号。它创建了一个新符号,其名称是这些输入符号名称的串联。
正确设计的 Lisp 程序很少依赖于符号的命名方式。它们依赖于作为唯一实体的符号。
如果您使用符号来标识事物,并且 5 和 A 都标识了某个实体,那么最好的答案不一定是创建一个新符号,它至少在名称上是这两个符号。例如,更好的设计可能是接受名称是多方面的或以某种方式复合的。或许(A 5)这个列表可以作为一个名字。
Common Lisp 函数本身可以有复合名称。例如(setf foo) 是一个函数名。列表之类的聚合可以是名称。
如果您只需要机器在运行时创造独特的符号,请考虑使用gensym 函数。您可以将自己的前缀传递给它:
(gensym "FOO") -> #:FOO0042
当然,前缀可以是一些现有符号的名称,通过symbol-name 拉出。符号#:FOO0042 不是唯一的,因为0042 而是因为它是地址空间中新分配的对象。 #: 表示它没有在任何包中实习。符号名称为FOO0042。
如果你仍然想要,一个简单的方法来获取一堆输入对象的打印表示并将其转换为一个符号:
(defun mashup-symbol (&rest objects)
(intern (format nil "~{~a~}" objects)))
例子:
(mashup-symbol 1 2 3) -> |123|
(mashup-symbol '(a b) 'c 3) -> |(A B)C3|