我无法将列表中的两个项目合并为一个项目。
例如:
'(Ben Hofferber) => '(Ben_Hofferber) or '(Ben-Hofferber)
关于如何实现这一目标的任何想法?
我一直在搞乱打印功能试图让它以这种方式工作而没有成功。我需要组合和分离这些项目,以便我可以将它们用作一个列表的键。
答案 0 :(得分: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)
但是,如果你坚持将符号组合成一个符号,你将不得不解释你想如何做到这一点。
如果两个符号都在同一个包中,则组合符号也可以放在那里:
(defun combine-symbols (s1 s2)
(intern (concatenate 'string (symbol-name s1) "-" (symbol-name s2))
(symbol-package s1)))
但是如果它们位于不同的包中(例如cl:car
和cl-user::ben
),则必须选择哪个包。
或者,您可以使用字符串并使用
(defun combine-objects (o1 o2)
(format nil "~A-~A" o1 o2))
不要忘记将:test #'equal
或:test #'string=
传递给assoc
。