2010-09-13 15 views
6

Decir que tengo una función que toma una lista y hace algo:Common Lisp - Utilizando una función como entrada a otra función

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

Pero si la lista está anidado Quiero aplanarlo primero antes que el bucle cosas, así que quiero utilizar otra función (defun aplanar (aList)) que se aplana cualquier lista:

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

Lisp no le gusta esto. ¿Hay otra forma directa de evitar esto?

Respuesta

5

Aquí hay una manera:

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

genial, gracias! – John

1

Puede pasar a la función como un argumento &optional.

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

Un análisis de la muestra, donde dostuff sólo imprimir su argumento:

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

Este enfoque es más flexible ya que no está atado a una sola función 'pre-procesador'.

Cuestiones relacionadas