Add yield from via macro magic.
This will let us use (basic) yield from behavior from Python 2. This isn't complete, and is low-hanging fruit for others willing to hack on hy. I've also changed the macrosystem to allow for proper bootstrapping. This is similar to how it's done elsewhere in the codebase (stdlib stuff).
This commit is contained in:
parent
bffe3a05fa
commit
1c12b2870e
6
hy/core/macros.hy
Normal file
6
hy/core/macros.hy
Normal file
@ -0,0 +1,6 @@
|
||||
;;; hy core macros
|
||||
|
||||
(defmacro yield-from [_hy_yield_from_els]
|
||||
(quasiquote
|
||||
(for [_hy_yield_from_x (unquote _hy_yield_from_els)]
|
||||
(yield _hy_yield_from_x))))
|
18
hy/macros.py
18
hy/macros.py
@ -31,10 +31,14 @@ from hy.util import str_type
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
MACROS = [
|
||||
CORE_MACROS = [
|
||||
"hy.core.bootstrap",
|
||||
]
|
||||
|
||||
EXTRA_MACROS = [
|
||||
"hy.core.macros",
|
||||
]
|
||||
|
||||
_hy_macros = defaultdict(dict)
|
||||
|
||||
|
||||
@ -74,7 +78,7 @@ _wrappers = {
|
||||
|
||||
|
||||
def process(tree, module_name):
|
||||
load_macros()
|
||||
load_macros(module_name)
|
||||
old = None
|
||||
while old != tree:
|
||||
old = tree
|
||||
@ -82,8 +86,14 @@ def process(tree, module_name):
|
||||
return tree
|
||||
|
||||
|
||||
def load_macros():
|
||||
for module in MACROS:
|
||||
def load_macros(module_name):
|
||||
for module in CORE_MACROS:
|
||||
__import__(module)
|
||||
|
||||
if module_name.startswith("hy.core"):
|
||||
return
|
||||
|
||||
for module in EXTRA_MACROS:
|
||||
__import__(module)
|
||||
|
||||
|
||||
|
@ -91,3 +91,11 @@
|
||||
(assert initialized)
|
||||
(assert (test-initialized))
|
||||
|
||||
|
||||
(defn test-yield-from []
|
||||
"NATIVE: testing yield from"
|
||||
(defn yield-from-test []
|
||||
(for [i (range 3)]
|
||||
(yield i))
|
||||
(yield-from [1 2 3]))
|
||||
(assert (= (list (yield-from-test)) [0 1 2 1 2 3])))
|
||||
|
Loading…
Reference in New Issue
Block a user