2010-09-13 131 views
6

说我有一个函数,它接受一个列表,并做一些事情:Common Lisp的 - 使用功能输入到另一个功能

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

但如果该列表是嵌套我希望循环做之前先弄平的东西,所以我想用另一个函数(defun定义压扁(ALIST)),以展的任何列表:

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

Lisp的不喜欢这一点。有没有另一种直接的解决方法呢?

回答

5

这里有一种方法:

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

太棒了,谢谢! – John 2010-09-13 16:08:09

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) 

这种方法是你是不依赖于只有一个“预处理器”的功能更加灵活。