Common Lisp - 使用函数作为另一个函数的输入

时间:2010-09-13 15:46:02

标签: function lisp common-lisp

假设我有一个列表并执行某项操作的函数:

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

但是如果列表是嵌套的,我想在循环执行之前先将它展平,所以我想使用另一个函数(defun flatten(aList))来展平任何列表:

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

Lisp不喜欢这个。还有另一种直接解决方法吗?

2 个答案:

答案 0 :(得分:5)

这是一种方式:

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

答案 1 :(得分:1)

您可以将该函数作为&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)

这种方法更灵活,因为您不仅仅依赖于一个“预处理器”功能。