2013-04-16 50 views
0

我無法將列表中的兩個項目合併爲一個項目。在Common Lisp中合併列表項(Clisp)

例如:

'(Ben Hofferber) => '(Ben_Hofferber) or '(Ben-Hofferber) 

如何可以做到這一點任何想法?

我一直在搞打印功能試圖讓它以沒有成功的方式工作。我需要組合和分離這些項目,以便我可以使用它們作爲一個列表的關鍵。

+0

您應該指定列表中的元素可能是什麼,以及「結合」的含義。例如,你將如何結合來自不同包裝的兩個符號? – sds

+0

基本上我想將數據從一個列表中的兩個元素合併到一個元素中。所以從'(本霍夫弗伯)到'(Ben_Hofferber),cdr將返回零而不是Hofferber。 – Hoffination

+0

您沒有回答我的問題:您想如何將符號cl:car與符號cl-user :: Ben結合使用? – sds

回答

0

您也可以使用列表作爲alist鍵。 例如,

(assoc '(1 2) '(((1 1) a) ((1 2) b) ((1 3) c)) :test #'equal) 
==> ((1 2) B) 

所以,如果你有一個人

(defparameter *people* '((Ben Hofferber) (Adam Young))) 

一個列表,你可以設置他們的年齡是這樣的:

(defparameter *ages* (mapcar #'list *people* '(20 11))) 

,並發現它們是這樣的:

(assoc '(Ben Hofferber) *ages* :test #'equal) 
==> ((BEN HOFFERBER) 20) 

但是,如果你insi把符號合併成一個,你必須解釋你想怎麼做。

如果兩個符號是在同一個包,組合符號可以放在那裏太:

(defun combine-symbols (s1 s2) 
    (intern (concatenate 'string (symbol-name s1) "-" (symbol-name s2)) 
      (symbol-package s1))) 

,但如果他們在不同的包(例如,cl:carcl-user::ben),你將不得不作出一個艱難的選擇,哪個包去。

或者,你可以去用繩子和使用

(defun combine-objects (o1 o2) 
    (format nil "~A-~A" o1 o2)) 

不要忘記通過:test #'equal:test #'string=assoc