(DEFUN MAPKAR (FUN FIRST &REST LISTS) (PROG (ARGS HEAD TAIL Q A) (SETQ LISTS (CONS FIRST LISTS)) ;; Make a skeleton ARGS list (SETQ Q LISTS) 10 (IF (NULL Q) (GO 20)) (SETQ ARGS (CONS NIL ARGS)) (SETQ Q (CDR Q)) (GO 10) ;; Advance all lists and gather the CARs 20 (SETQ Q LISTS) (SETQ A ARGS) 30 (IF (NULL Q) (GO 40)) ;; When any of the lists is exhausted, we're done (IF (NULL (CAR Q)) (RETURN HEAD)) (RPLACA A (CAAR Q)) (RPLACA Q (CDAR Q)) (SETQ Q (CDR Q) A (CDR A)) (GO 30) ;; Apply the function and gather the result 40 (SETQ Q (APPLY FUN ARGS)) (IF TAIL (SETQ TAIL (CDR (RPLACD TAIL (CONS Q NIL)))) (SETQ HEAD (SETQ TAIL (CONS Q NIL)))) (GO 20)))