我想插入一个char到列表中。 不过,我想在列表中的最后一个符号合并这个字符。 随着追加利弊的结果通常是两个不同的符号。 嗯,我想一个合并符号是我的结果。
例:
(XXXX 'a '5) ====> (a5)
我想有而不是,:
(XXXX 'a '5) ====> (a 5)
我想插入一个char到列表中。 不过,我想在列表中的最后一个符号合并这个字符。 随着追加利弊的结果通常是两个不同的符号。 嗯,我想一个合并符号是我的结果。
例:
(XXXX 'a '5) ====> (a5)
我想有而不是,:
(XXXX 'a '5) ====> (a 5)
在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|
这个定义:
(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什么。
这个问题的答案,你问的问题是
(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)))
不过,我敢肯定这是不是你真正想要问的问题。
以编程方式创建新的符号是不是初学者应该做的事...