merge - 在 common lisp 中合并符号

标签 merge lisp common-lisp symbols

我想在列表中插入一个字符。但是,我想将此字符与列表中的最后一个符号合并。使用 appends 和 cons 结果总是两个不同的符号。好吧,我想要一个合并符号作为我的结果。

例子:

       (XXXX 'a '5) ====>  (a5)    

我想拥有的,而不是:

       (XXXX 'a '5) ====> (a 5)   

最佳答案

你不能在 Lisp 中“合并符号”。

首先,5不是一个符号,而是一个数字。如果您想要一个名为 "5" 的符号,您必须将其键入 |5|(例如)。

如果函数采用符号 A 和符号 |5|,并生成符号 A5,则它没有合并符号。它创建了一个新符号,其名称是那些输入符号名称的串联。

正确设计的 Lisp 程序很少依赖于符号的命名方式。它们依赖于作为唯一实体的符号。

如果您使用符号来标识事物,并且 5A 都标识某个实体,那么最好的答案不一定是创建一个新的符号,至少在名称上,是这两个符号的混搭。例如,更好的设计可能是接受名称是多方面的或以某种方式复合的。也许列表 (A 5) 可以作为一个名字。

Common Lisp 函数本身可以有复合名称。例如 (setf foo) 是一个函数名。列表等聚合可以是名称。

如果您只需要机器在运行时发明独特的符号,请考虑使用 gensym 函数。您可以将自己的前缀传递给它:

(gensym "FOO") -> #:FOO0042

当然,前缀可以是一些现有交易品种的名称,通过symbol-name 提取。由于 0042,符号 #:FOO0042 不是唯一的,而是因为它是地址空间中新分配的对象。 #: 表示它不在任何包中。符号的名称是 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|

关于merge - 在 common lisp 中合并符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15710108/

相关文章:

mysql - MYSQL上合并数据的最佳方法

r - 在R中按组查找不同数据集中的匹配值

programming-languages - 修复 Lisp 语法

mysql - 设计您自己的 MySQL 或 PostgreSQL 连接?

lisp - 如何通过知道其在 lisp 中的位置来查找列表元素?

python - 合并列表列失败

linux - merge 远程仓库提交到本地

lisp - 方案符号等价

LISP 关于创建新列表的简单问题

error-handling - 捕获但继续 Common Lisp 中的警告