【问题标题】:Combine list items in Common Lisp (Clisp)在 Common Lisp (Clisp) 中组合列表项
【发布时间】:2013-04-16 08:10:53
【问题描述】:

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

例如:

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

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

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

【问题讨论】:

  • 您应该指定列表的元素可能是什么以及“组合”的含义。例如,您将如何组合来自不同包的两个符号?
  • 基本上我想将列表中两个元素的数据组合到一个元素中。所以从 '(Ben Hofferber) 到 '(Ben_Hofferber) ,其中 cdr 将返回 nil 而不是 Hofferber。
  • 你没有回答我的问题:你想如何将符号 cl:car 与符号 cl-user::Ben 结合起来?

标签: list merge clisp


【解决方案1】:

您也可以将列表用作 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

【讨论】:

    猜你喜欢
    • 2017-02-23
    • 1970-01-01
    • 2010-09-15
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 2014-11-28
    相关资源
    最近更新 更多