Skip to content

Instantly share code, notes, and snippets.

@einblicker
Created October 24, 2011 05:37
Show Gist options
  • Save einblicker/1308435 to your computer and use it in GitHub Desktop.
Save einblicker/1308435 to your computer and use it in GitHub Desktop.
inner macroexpand
(defun %walker (code test result &optional (cons-fn #'cons))
(labels ((iter (code)
(if (consp code)
(if (and (consp (car code)) (funcall test (car code)))
(funcall cons-fn
(funcall result (car code))
(iter (cdr code)))
(cons
(iter (car code))
(iter (cdr code))))
code)))
(iter code)))
(defmacro walker (code test result &optional (cons-fn #'cons))
`(%walker ,code ,test ,result ,cons-fn))
(defmacro inner-macroexpand (macro form)
(walker
form
(lambda (form)
(eq macro (car form)))
(lambda (form)
(macroexpand-1 form))))
(defmacro inner-macroexpand-inj (macro form)
(walker
form
(lambda (form)
(eq macro (car form)))
(lambda (form)
(macroexpand-1 form))
#'append))
;;; example
(defmacro erl-cons (x y)
(if (eq x y)
(let ((g (gensym)))
`(and (cons ,x ,g) (when (equal ,x ,g))))
`(cons ,x ,y)))
(ql:quickload :fare-matcher)
(import 'fare-matcher:match)
(inner-macroexpand
erl-cons
`(match (cons 1 1)
((erl-cons x x) 'matched)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment