【问题标题】:Common Lisp - Using a function as input to another functionCommon Lisp - 使用一个函数作为另一个函数的输入
【发布时间】:2011-04-11 17:59:21
【问题描述】:
假设我有一个接受列表并执行某些操作的函数:
(defun foo(aList)
(loop for element in aList ...))
但是如果列表是嵌套的,我想在循环执行操作之前先将其展平,所以我想使用另一个展平任何列表的函数 (defun flatten(aList)):
(defun foo(flatten(aList))
(loop for element in aList ...))
Lisp 不喜欢这样。还有其他直接的方法吗?
【问题讨论】:
标签:
function
lisp
common-lisp
【解决方案1】:
这是一种方法:
(defun foo (alist)
(loop for element in (flatten alist) ...)
【解决方案2】:
您可以将函数作为&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)
这种方法更加灵活,因为您不仅仅局限于一个“预处理器”功能。