2025-07-01-00-50

40 阅读1分钟
#+name: 2025-07-01-00-50
#+begin_src emacs-lisp :results silent
  (defmacro !let (bindings &rest body)
    (declare (indent 1) (debug let))
    (cond
     ((null bindings) `(progn ,@body))
     (t
      (let (vars vals)
        (mapc
         (lambda (binding)
           (push (or (car-safe binding) binding) vars)
           (push (car (cdr-safe binding)) vals))
         bindings)
        `(cl-macrolet
             ,(mapcar
               (lambda (s)
                 `(,s (&rest args)
                      `(funcall ,',s ,@args)))
               (nreverse vars))
           (funcall
            (lambda (,@(nreverse vars))
              ,@body)
            ,@(nreverse vals)))))))
#+end_src