(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
(#### ....)?
答案 0 :(得分:1)
对于Common Lisp,请使用以下功能之一:
REMOVE-IF
REMOVE-IF-NOT
REMOVE
他们查看列表并删除项目。保留你想要的那些。
其他明智的LOOP
会这样做:
(LOOP for item in some-list
when (predicate-p item)
collect it)
IT
是LOOP
功能 - >它引用谓词在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
函数,该函数执行相同的操作,但是非破坏性的。这对你的工具包有时很有用。