#| I wrote this macro for explaining 'MAPCAR in terms of 'LOOP to pizzapal deep within one of James' mastodon threads. |# (defmacro loopcar (fun &rest lists &aux (syms (loop for x in lists collect (gensym)))) `(loop ,@(loop for list in lists for sym in syms nconcing (list :for syn :in list)) collecting (funcall ,fun ,@syms))) #| We were also talking about how big the common lisp standard is: But there's so much useful stuff in there (that went into my explanation of 'MAPCAR). I had actually been hoping to find a simple definition of mapcar's behaviour analogous to this definitionally correct description of mapcon in terms of maplist: (mapcon f x1 ... xn) := (apply #'nconc (maplist f x1 ... xn)) but mapcar and maplist get prose definitions. Maybe (labels ((%cars (lists) (if (null lists) nil (cons (caar lists) (%cars (cdr lists))))) (%cdrs (lists) (if (null lists) nil (cons (cdar lists) (%cdrs (cdr lists))))) (%mapcar (f &rest rest) (if (some 'null rest) nil (cons (apply f (%cars rest)) (%mapcar f (%cdrs rest)))))) (%mapcar f x1 ... xn)) Though we would never see this in common lisp because we have the mapcar family in the standard. |#