我想插入一個字符到列表中。但是,我想將此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