假设我有一个列表并执行某项操作的函数:
(defun foo(aList)
(loop for element in aList ...))
但是如果列表是嵌套的,我想在循环执行之前先将它展平,所以我想使用另一个函数(defun flatten(aList))来展平任何列表:
(defun foo(flatten(aList))
(loop for element in aList ...))
Lisp不喜欢这个。还有另一种直接解决方法吗?
答案 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)
这种方法更灵活,因为您不仅仅依赖于一个“预处理器”功能。