#!/usr/local/bin/sbcl --script (defmacro -> (form &rest forms) (if (null forms) form (let ((git (intern (symbol-name '#:it)))) `(let ((,git ,form)) (-> ,@forms))))) (defun square (n) (* n n)) (defun add1 (n) (1+ n)) (defun macroexpand-all (form &optional environment) (let ((sb-walker::*walk-form-expand-macros-p* t)) (sb-walker:walk-form form environment (lambda (subform context env) (acond ((and (eq context :eval) (listp subform) (symbolp (car subform)) (get (car subform) :partial-macroexpander)) ;; The partial expander must return T as its second value ;; if it wants to stop the walk. (funcall it subform env)) (t subform)))))) (princ (macroexpand-all '(-> 5 (add1 it) (square it))))