我想插入一个字符到列表中。但是,我想将此char与列表中的最后一个符号合并。附加和缺点结果总是两个不同的符号。那么,我想要一个合并符号成为我的结果。合并符号共同lisp
例子:
(XXXX 'a '5) ====> (a5)
我想吃些什么,而不是:
(XXXX 'a '5) ====> (a 5)
我想插入一个字符到列表中。但是,我想将此char与列表中的最后一个符号合并。附加和缺点结果总是两个不同的符号。那么,我想要一个合并符号成为我的结果。合并符号共同lisp
例子:
(XXXX 'a '5) ====> (a5)
我想吃些什么,而不是:
(XXXX 'a '5) ====> (a 5)
这个问题的答案,你问的问题是
(defun concatenate-objects-to-symbol (&rest objects)
(intern (apply #'concatenate 'string (mapcar #'princ-to-string objects))))
(concatenate-objects 'a 'b) ==> ab
哦,如果你想a list作为结果:
(defun xxxx (s1 s2) (list (concatenate-objects-to-symbol s1 s2)))
不过,我敢肯定这是不是的问题,你实际上要问。
创建新的符号编程是不是初学者应该做的事...
定义是:
(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函数(我忘了:(),它将任何东西串联起来。
函数'string'将字符串指定符字符串化,但不是,路径名称 – sds
你不能在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|
啊是'format' - 编程语言中的编程语言... – GoZoner
由于一旦您将令牌输入到您的Lisp侦听器中,该侦听器将被解释为符号名称,您就已经创建了一个符号。 – Kaz
不公平!你复制我的答案! (定义xxxx(s1 s2)...) –
GoZoner