2010-09-13 13 views
6

Dire che ho una funzione che prende una lista e fa qualcosa:Common Lisp - Utilizzando una funzione come input per un'altra funzione

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

Ma se la lista è annidato voglio appiattirla prima prima del ciclo fa roba, quindi voglio usare un'altra funzione (defun appiattire (aList)) che appiattisce qualsiasi elenco:

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

Lisp non piace questo. C'è un altro modo diretto intorno a questo?

risposta

5

Ecco un modo:

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

fantastico, grazie! – John

1

È possibile passare alla funzione come argomento &optional.

(defun foo (alist &optional fn) 
    (if (not (null fn)) 
     (setf alist (funcall fn alist))) 
    (dostuff alist)) 

Un esempio del suo funzionamento in cui dostuff basta stampare il suo argomento:

(foo '(1 2 (3))) 
=> (1 2 (3)) 
(foo '(1 2 (3)) #'flatten) 
=> (1 2 3) 

Questo approccio è più flessibile in quanto non sono legati ad una sola funzione di 'pre-processor'.