Donc j'apprends le Lisp à l'école et l'un des programmes que je dois créer est celui qui duplique la fonctionnalité de remove-if-not en utilisant mapcan. J'ai créé le programme et cela fonctionne correctement mais je ne comprends pas la sortie.Pourquoi ce programme renvoie-t-il une liste d'atomes?
Plus précisément, si je devais courir:
(findall 'numberp '(1 a 3))
La sortie est: (1 3)
Le programme est le suivant:
(defun findAll (fct l)
(cond
((null l) nil)
((mapcan (lambda(x) (if (funcall fct x) (list x) nil)) l))
)
)
Ma compréhension de la solution est ce qui suit: "Pour chaque élément de la liste, l appelle la fonction lambda Si le résultat de la fonction est ajusté et que l'élément x retourne vrai, alors retourne l'élément su Ce que je ne comprends pas, c'est comment une série d'appels consécutifs à "list (x)" retournera à la fin une liste d'atomes tels que (1 2).
Mais pourquoi le résultat final est-il joint? N'est-ce pas juste un tas de listes? – edoreld
@edoreld: MAPCAN le fait. Voir sa documentation: http://www.lispworks.com/documentation/HyperSpec/Body/f_mapc_.htm#mapcan –