组合Common Lisp(Clisp)中的列表项

时间:2013-04-16 08:10:53

标签: list merge clisp

我无法将列表中的两个项目合并为一个项目。

例如:

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

关于如何实现这一目标的任何想法?

我一直在搞乱打印功能试图让它以这种方式工作而没有成功。我需要组合和分离这些项目,以便我可以将它们用作一个列表的键。

1 个答案:

答案 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:carcl-user::ben),则必须选择哪个包。

或者,您可以使用字符串并使用

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

不要忘记将:test #'equal:test #'string=传递给assoc