Используйте do, if и funcall для определения (удовлетворения fun lst), который возвращает список элементов в списке, которые удовлетворяют функции

Я смотрел вокруг и до сих пор не понимаю, как работает funcall. Был бы очень признателен, если бы кто-нибудь мог дать мне предложение о способах решения проблемы. Я знаю, что "развлечение" должно быть функцией предиката, но после этого я застрял

кстати, элемент удовлетворяет функции, если функция возвращает истину, когда этот элемент используется в качестве аргумента функции.

3 ответа

(funcall #'+ 1 2 3 4 5 6 7 8)

;        ^   -------+-------
;        |          |
;        |          Arguments
;        Function

; returns 36

(funcall '+ 1 2 3) возвращает тот же результат, что и (+ 1 2 3) => 6

Преимущество состоит в том, что в первом случае функция может быть переменной.

(setq fun '+)
(funcall fun 1 2 3) => 6

Аналогичная функция применяется, когда аргументы сгруппированы в список:

(apply '+ '(1 2 3)) => 6

К вашей проблеме:

(defun fun-satisfiers (pred-fun list)
  (let ((acc nil))
    (do ((l list (cdr l)))
        ((null l) (nreverse acc))
      (if (funcall pred-fun (car l))
          (setf acc (cons (car l) acc))))))

Такая функция уже существует в базе common-lisp как filter.

Другие вопросы по тегам