Merge pull request #1664 from brandonwillard/require-in-macroexpand-all
Expand `require`d macros in `macroexpand-all`
This commit is contained in:
commit
109c0b0f5b
1
AUTHORS
1
AUTHORS
@ -89,3 +89,4 @@
|
|||||||
* Simon Gomizelj <simon@vodik.xyz>
|
* Simon Gomizelj <simon@vodik.xyz>
|
||||||
* Yigong Wang <wang@yigo.ng>
|
* Yigong Wang <wang@yigo.ng>
|
||||||
* Oskar Kvist <oskar.kvist@gmail.com>
|
* Oskar Kvist <oskar.kvist@gmail.com>
|
||||||
|
* Brandon T. Willard <brandonwillard@gmail.com>
|
1
NEWS.rst
1
NEWS.rst
@ -91,6 +91,7 @@ Misc. Improvements
|
|||||||
----------------------------
|
----------------------------
|
||||||
* `hy-repr` uses registered functions instead of methods.
|
* `hy-repr` uses registered functions instead of methods.
|
||||||
* `hy-repr` supports more standard types.
|
* `hy-repr` supports more standard types.
|
||||||
|
* `macroexpand-all` will now expand macros introduced by a `require` in the body of a macro.
|
||||||
|
|
||||||
0.14.0
|
0.14.0
|
||||||
==============================
|
==============================
|
||||||
|
@ -43,7 +43,8 @@
|
|||||||
(defn macroexpand-all [form &optional module-name]
|
(defn macroexpand-all [form &optional module-name]
|
||||||
"Recursively performs all possible macroexpansions in form."
|
"Recursively performs all possible macroexpansions in form."
|
||||||
(setv module-name (or module-name (calling-module-name))
|
(setv module-name (or module-name (calling-module-name))
|
||||||
quote-level [0]) ; TODO: make nonlocal after dropping Python2
|
quote-level [0]
|
||||||
|
ast-compiler (HyASTCompiler module-name)) ; TODO: make nonlocal after dropping Python2
|
||||||
(defn traverse [form]
|
(defn traverse [form]
|
||||||
(walk expand identity form))
|
(walk expand identity form))
|
||||||
(defn expand [form]
|
(defn expand [form]
|
||||||
@ -64,7 +65,10 @@
|
|||||||
[True (traverse form)])]
|
[True (traverse form)])]
|
||||||
[(= (first form) 'quote) form]
|
[(= (first form) 'quote) form]
|
||||||
[(= (first form) 'quasiquote) (+quote)]
|
[(= (first form) 'quasiquote) (+quote)]
|
||||||
[True (traverse (mexpand form (HyASTCompiler module-name)))])
|
[(= (first form) (HySymbol "require"))
|
||||||
|
(ast-compiler.compile form)
|
||||||
|
(return)]
|
||||||
|
[True (traverse (mexpand form ast-compiler))])
|
||||||
(if (coll? form)
|
(if (coll? form)
|
||||||
(traverse form)
|
(traverse form)
|
||||||
form)))
|
form)))
|
||||||
@ -325,4 +329,3 @@ as can nested let forms.
|
|||||||
expander)))
|
expander)))
|
||||||
|
|
||||||
;; (defmacro macrolet [])
|
;; (defmacro macrolet [])
|
||||||
|
|
||||||
|
@ -56,7 +56,15 @@
|
|||||||
(do '(with [b 2])
|
(do '(with [b 2])
|
||||||
`(with [c 3]
|
`(with [c 3]
|
||||||
~(with* [d 4] (do))
|
~(with* [d 4] (do))
|
||||||
~@[(with* [e 5] (do))]))))))
|
~@[(with* [e 5] (do))])))))
|
||||||
|
|
||||||
|
(defmacro require-macro []
|
||||||
|
`(do
|
||||||
|
(require [tests.resources.macros [test-macro :as my-test-macro]])
|
||||||
|
(my-test-macro)))
|
||||||
|
|
||||||
|
(assert (= (last (macroexpand-all '(require-macro)))
|
||||||
|
'(setv blah 1))))
|
||||||
|
|
||||||
(defn test-let-basic []
|
(defn test-let-basic []
|
||||||
(assert (zero? (let [a 0] a)))
|
(assert (zero? (let [a 0] a)))
|
||||||
|
@ -7,3 +7,6 @@
|
|||||||
(defn f [&rest args] (.join "" (+ (, "c") args)))
|
(defn f [&rest args] (.join "" (+ (, "c") args)))
|
||||||
(setv variable (HySymbol (->> "d" (f))))
|
(setv variable (HySymbol (->> "d" (f))))
|
||||||
`(setv ~variable 5))
|
`(setv ~variable 5))
|
||||||
|
|
||||||
|
(defmacro test-macro []
|
||||||
|
'(setv blah 1))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user