2010-09-13 5 views
6

Dire que j'ai une fonction qui prend une liste et fait quelque chose:Common Lisp - Utilisation d'une fonction d'entrée à une autre fonction

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

Mais si la liste est imbriquée je veux aplatir avant de la boucle ne choses, donc je veux utiliser une autre fonction (defun aplatir (aList)) qui aplatit toute la liste:

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

Lisp n'aime pas. Y a-t-il un autre moyen direct de contourner cela?

Répondre

5

est ici une façon:

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

super, merci! – John

1

Vous pouvez passer la fonction comme un argument &optional.

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

Un échantillon analysé où dostuff juste imprimer son argument:

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

Cette approche est plus souple que vous n'êtes pas lié à une seule fonction «pré-processeur.

Questions connexes