Используйте 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
.