叉乘map

25 阅读1分钟
​‍​​‍‍‌‍‍‌‍​‌‌‍‌‌‍‌‌​‍‍​‍​​​​‍​​​​​‍​‌‌​‍‌​​​​‍‌​‍‌​​‌​‍‌​‍‌​​‍​​​‍‌​​​‌‍​​‍‍​‍​​‍‍‌‍​‍‌‍‌‌‌‍‌‌‍‍‌‌‍‍‌‌‌​‌​‍‌‍​​‍​​‌‍‌‌‌‍‌‌‍​‌‌‍​‌​​‍‌‌‍​‌‍‍‌‌​‌​​​‍​​​‍‍‌​‍‌‍‌‌‌​‌‌‌‌‍​‌‌​‌​​‍​​‌​‌‍‍‌‌‍​‌‍‌‌‌‍‍‌‌​​‍​​​‍‍‌‍‌‌‌‌‍‌‍​‌‌‍​​‍​​‌‍‍‌‍​​‍‍(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)))​​‍‍​‍​​‍‍‌‍‌‌‌‍‍‌‍‌​‌‌‌​‌​‍‌‍​