2012-03-30 3 views
1
(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, как мне получить список всех значений дочерних элементов node с соответствующими attr здесь (по адресу #### ....) ?Как пользоваться картой здесь?

+1

Какой это? –

+0

omg, он не работает ... следовательно, здесь, в SO. – nakiya

ответ

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.

+0

те функции удаления, которые мне нужны! – nakiya

+0

Я не знал, что у петли были анафоры; это полезная функция –

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 ожидает, что функции возвращать списки, и это разрушительно catenates их. Поэтому вы должны быть осторожны, чтобы не возвращать цитируемые списки из лямбды или какие-либо списки, которые пришли откуда-то еще (здесь не было).

В Парадигмы программирования искусственного интеллекта (a.k.a PAIP), Питер Норвиг вводит mappend функцию, которая делает то же самое, но неразрушающий. Это полезно иметь в вашем инструментарии иногда.

Смежные вопросы