2013-04-16 51 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