Common Lisp - Использование функции в качестве входных данных для другой функции

Скажем, у меня есть функция, которая принимает список и что-то делает:

(defun foo(aList)
   (loop for element in aList ...))

Но если список вложен, я хочу сначала сгладить его, прежде чем цикл выполнит что-то, поэтому я хочу использовать другую функцию (defun flatten (aList)), которая сглаживает любой список:

(defun foo(flatten(aList))
   (loop for element in aList ...))

Лиспу это не нравится. Есть ли другой прямой способ обойти это?


person John    schedule 13.09.2010    source источник


Ответы (2)


Вот один из способов:

(defun foo (alist)
  (loop for element in (flatten alist) ...)
person Xach    schedule 13.09.2010

Вы можете передать функцию как &optional аргумент.

(defun foo (alist &optional fn)
  (if (not (null fn))
      (setf alist (funcall fn alist)))
  (dostuff alist))

Пример выполнения, в котором dostuff просто выводит свой аргумент:

(foo '(1 2 (3)))
=> (1 2 (3))
(foo '(1 2 (3)) #'flatten)
=> (1 2 3)

Этот подход более гибкий, поскольку вы не привязаны только к одной функции «препроцессора».

person Vijay Mathew    schedule 14.09.2010