Ab und an entdecke ich in den Programmiersprachen, die ich verwende, kleine Details, die mir bislang unbekannt waren und die mich dann gleich dermaßen faszinieren, daß ich über sie bloggen muß.

Ein solches kleines Juwel ist die Funktion MAPCAN. Sie ist im Grunde identisch mit der Komposition von NCONC bzw. APPEND mit MAPCAR, das heißt: Sie iteriert über eine Liste und baut aus ihr eine neue Liste auf, wobei in jedem Schritt beliebig viele Elemente in die neue Liste aufgenommen werden können. Ein Beispiel:

(mapcan #'(lambda (x)  
            (if (fboundp x)  
                (list (intern (symbol-name x) :keyword)  
                      (fdefinition x))  
                '()))  
        '(cadr cons hello mulk +))  
;; => (:CADR #<Function CADR {102EBD41}>  
;;     :CONS #<Function CONS {10555969}>  
;;     :+ #<Function + {10185A81}>) 

Wie man an diesem zugegebenermaßen an den Haaren herbeigezogenen Beispiel sieht, eignet sich MAPCAN dazu, eine Liste in eine andere Liste zu verwandeln, wenn entweder nicht alle Elemente verarbeitet werden sollen oder man für jedes einzelne Element mehrere Ausgabeelemente braucht -- und zwar auch, wenn man nicht a priori weiß, wie viele.