如何在这里使用mapcar?

时间:2012-03-30 16:07:54

标签: lisp common-lisp

(defun find-attr (node attr)
    (let ((children (pt-children node)))
      (if (null children)
          nil
          (let ((subchildren (mapcar ##############

(get-value-if-attrib-present (node attrib) ...)

pt是一个班级。 (pt-children node)会产生node个孩子,这些孩子也是pt个对象。 attr是一个字符串。支持我写get-value-if-attrib-present以返回pt对象的值,如果它具有匹配的attr,我如何获取{{1}的子子的所有值的列表这里匹配node(#### ....)?

2 个答案:

答案 0 :(得分:1)

对于Common Lisp,请使用以下功能之一:

  • REMOVE-IF
  • REMOVE-IF-NOT
  • REMOVE

他们查看列表并删除项目。保留你想要的那些。

其他明智的LOOP会这样做:

(LOOP for item in some-list
      when (predicate-p item)
      collect it)

ITLOOP功能 - >它引用谓词在WHEN子句中返回的值。

答案 1 :(得分:1)

映射方法:

;; assuming get-value-if-attrib-present simply returns nil when not present
;; (i.e. your attribute value cannot be nil without ambiguity)
;;
;; get the list of values from the children, matching attrib
;;
(mapcan (lambda (child)
          (if (get-value-if-attrib-present child attrib)
            (list child)))
        children)

mapcan期望函数返回列表,并且它破坏性地连接它们。因此,您必须小心不要返回lambda中的引用列表,或者来自其他地方的任何列表(此处未提及)。

人工智能编程的范例(a.k.a PAIP)中,Peter Norvig介绍了一个mappend函数,该函数执行相同的操作,但是非破坏性的。这对你的工具包有时很有用。