use*_*521 3 lisp merge symbols common-lisp
我想在列表中插入一个字符.但是,我想将此char与列表中的最后一个符号合并.有了追加和缺点,结果总是两个不同的符号.好吧,我想要一个合并的符号作为我的结果.
例:
(XXXX 'a '5) ====> (a5)
Run Code Online (Sandbox Code Playgroud)
我希望拥有什么,而不是:
(XXXX 'a '5) ====> (a 5)
Run Code Online (Sandbox Code Playgroud)
Kaz*_*Kaz 10
你不能在Lisp中"合并符号".
首先,5不是一个符号,而是一个数字.如果您想要一个名为的符号"5",则必须将其键入|5|(例如).
如果函数采用符号A和符号|5|,并生成符号A5,则它没有合并符号.它创建了一个新符号,其名称是这些输入符号名称的连接.
正确设计的Lisp程序很少依赖于符号的命名方式.它们依赖于符号是唯一的实体.
如果您使用符号识别的东西,都5和A确定一些实体,最好的答案是不是一定要创造一个新的符号是,在名字至少是这两个符号的混搭.例如,更好的设计可能是接受名称是多方面的或以某种方式复合.也许列表(A 5)可以作为名称.
Common Lisp函数本身可以有复合名称.例如(setf foo)是一个函数名.像列表这样的聚合可以是名称.
如果您只是需要机器在运行时创建唯一符号,请考虑使用该gensym功能.您可以将自己的前缀传递给它:
(gensym "FOO") -> #:FOO0042
Run Code Online (Sandbox Code Playgroud)
当然,前缀可以是一些现有符号的名称,通过引出symbol-name.该符号#:FOO0042不是唯一的,0042因为它是地址空间中新分配的对象.这#:意味着它不会在任何包装中实施.符号的名称是FOO0042.
如果你真的想要,一个简单的方法来获取一堆输入对象的打印表示并将其转换为符号是这样的:
(defun mashup-symbol (&rest objects)
(intern (format nil "~{~a~}" objects)))
Run Code Online (Sandbox Code Playgroud)
例子:
(mashup-symbol 1 2 3) -> |123|
(mashup-symbol '(a b) 'c 3) -> |(A B)C3|
Run Code Online (Sandbox Code Playgroud)
定义这个:
(defun symbol-append (&rest symbols)
(intern (apply #'concatenate 'string
(mapcar #'symbol-name symbols))))
Run Code Online (Sandbox Code Playgroud)
然后将其用作:
* (symbol-append 'a 'b 'c)
ABC
* (apply #'symbol-append '(a b c))
ABC
Run Code Online (Sandbox Code Playgroud)
如果您希望参数包含符号以外的内容,请替换symbol-name为:
(lambda (x)
(typecase x ...))
Run Code Online (Sandbox Code Playgroud)
或者一个预先存在的 CL 函数(我已经忘记了 :(),它可以将任何东西字符串化。
| 归档时间: |
|
| 查看次数: |
2201 次 |
| 最近记录: |