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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 13 сентября 2010

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

(defun foo (alist)
  (loop for element in (flatten alist) ...)
1 голос
/ 14 сентября 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)

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

...