Common Lisp中合并符号(Merging symbols in common lisp)

2019-08-18 06:46发布

我想插入一个char到列表中。 不过,我想在列表中的最后一个符号合并这个字符。 随着追加利弊的结果通常是两个不同的符号。 嗯,我想一个合并符号是我的结果。

例:

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

我想有而不是,:

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

Answer 1:

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

首先, 5不是一个符号,而是一个数字。 如果你想要一个名为符号"5"你必须把它作为类型|5| (例如)。

如果一个函数具有象征A和符号|5| ,并产生符号A5 ,它没有合并的符号。 它创造了一个新的符号,它的名字是那些输入符号的名称的连环。

设计得当的Lisp程序很少依赖于符号的命名方式。 他们依赖于符号是唯一的实体。

如果您使用符号识别的东西,都5A确定一些实体,最好的答案是不是一定要创造一个新的符号是,至少在名字,这两个符号的混搭。 举例来说,一个更好的设计可能是接受的名字是多面的或复合以某种方式。 也许列表(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|


Answer 2:

这个定义:

(defun symbol-append (&rest symbols) 
  (intern (apply #'concatenate 'string 
                 (mapcar #'symbol-name symbols))))

然后用它作为:

* (symbol-append 'a 'b 'c)
ABC

* (apply #'symbol-append '(a b c))
ABC

如果你希望你的论点包含除符号的东西,然后替换symbol-name有:

   (lambda (x)
     (typecase x ...)) 

或预先存在的CL功能(即我忘了:()是stringifies什么。



Answer 3:

这个问题的答案,你问的问题是

(defun concatenate-objects-to-symbol (&rest objects)
  (intern (apply #'concatenate 'string (mapcar #'princ-to-string objects))))
(concatenate-objects 'a 'b) ==> ab

哦,如果你想有一个列表作为结果:

(defun xxxx (s1 s2) (list (concatenate-objects-to-symbol s1 s2)))

不过,我敢肯定这是不是你真正想要问的问题。

以编程方式创建新的符号是不是初学者应该做的事...



文章来源: Merging symbols in common lisp