(defun !mapx (fun &rest lists)
(let ((vars nil) f)
(!def f
(lambda (f &rest L)
(let* ((x (gensym "x")))
(if (null L)
`(funcall ',f ,@(nreverse vars))
(setq vars (cons x vars))
`(,(if (length= L 1) 'mapcar 'mapcan)
(lambda (,x)
(map ,f ,@(cdr L)))
',(car L))))))
(!def f
(macroexpand-all
`(map ,fun ,@lists)
`((map . ,f) ,@macroexpand-all-environment)))
(eval f t)))