Как использовать mapcar здесь? - PullRequest
1 голос
/ 30 марта 2012
(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 здесь (в ####....)?

Ответы [ 2 ]

1 голос
/ 31 марта 2012
Подход сопоставления

:

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

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

1 голос
/ 30 марта 2012

Для Common Lisp используйте одну из следующих функций:

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

Они просматривают список и удаляют предметы. Оставьте те, которые вы хотите.

Другой мудрый LOOP сделает это:

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

IT - это функция LOOP -> она относится к значению, возвращаемому предикатом в предложении WHEN.

...