010986e8ca
This commit adds just enough namespacing to resolve a macro first in the macro's defining module's namespace (i.e. the module assigned to the `HyASTCompiler`), then in the namespace/module it's evaluated in. Namespacing is accomplished by adding a `module` attribute to `HySymbol`, so that `HyExpression`s can be checked for this definition namespace attribute and their car symbol resolved per the above. As well, a couple tests have been added that cover - the loading of module-level macros - e.g. that only macros defined in the `require`d module are added - the AST generated for `require` - using macros loaded from modules imported via bytecode - the non-local macro namespace resolution described above - a `require`d macro that uses a macro `require` exclusively in its module-level namespace - and that (second-degree `require`d) macros can reference variables within their module-level namespaces. Closes hylang/hy#1268, closes hylang/hy#1650, closes hylang/hy#1416.
22 lines
771 B
Hy
22 lines
771 B
Hy
(setv module-name-var "tests.resources.macros")
|
|
|
|
(defmacro thread-set-ab []
|
|
(defn f [&rest args] (.join "" (+ (, "a") args)))
|
|
(setv variable (HySymbol (-> "b" (f))))
|
|
`(setv ~variable 2))
|
|
|
|
(defmacro threadtail-set-cd []
|
|
(defn f [&rest args] (.join "" (+ (, "c") args)))
|
|
(setv variable (HySymbol (->> "d" (f))))
|
|
`(setv ~variable 5))
|
|
|
|
(defmacro test-macro []
|
|
'(setv blah 1))
|
|
|
|
(defmacro nonlocal-test-macro [x]
|
|
"When called from `macro-with-require`'s macro(s), the first instance of
|
|
`module-name-var` should resolve to the value in the module where this is
|
|
defined, then the expansion namespace/module"
|
|
`(.format (+ "This macro was created in {}, expanded in {} "
|
|
"and passed the value {}.")
|
|
~module-name-var module-name-var ~x)) |