繁体   English   中英

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

[英]Common Lisp - Using a function as input to another function

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

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

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

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

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

这是一种方式:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM