0

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

例如:

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

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

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

4

1 回答 1

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

于 2013-04-29T00:09:59.520 回答