Используйте do, if и funcall, чтобы определить (удовлетворить fun lst), который возвращает список элементов в списке, которые удовлетворяют функции - PullRequest
0 голосов
/ 26 января 2020

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

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

Ответы [ 3 ]

2 голосов
/ 27 января 2020

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

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

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

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

(apply '+ '(1 2 3)) => 6
2 голосов
/ 27 января 2020
(funcall #'+ 1 2 3 4 5 6 7 8)

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

; returns 36
0 голосов
/ 28 января 2020

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

(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.

...