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:
Paul Tagliamonte 2013-08-17 11:37:48 -04:00
parent bffe3a05fa
commit 1c12b2870e
3 changed files with 28 additions and 4 deletions

6
hy/core/macros.hy Normal file
View 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))))

View File

@ -31,10 +31,14 @@ from hy.util import str_type
from collections import defaultdict from collections import defaultdict
MACROS = [ CORE_MACROS = [
"hy.core.bootstrap", "hy.core.bootstrap",
] ]
EXTRA_MACROS = [
"hy.core.macros",
]
_hy_macros = defaultdict(dict) _hy_macros = defaultdict(dict)
@ -74,7 +78,7 @@ _wrappers = {
def process(tree, module_name): def process(tree, module_name):
load_macros() load_macros(module_name)
old = None old = None
while old != tree: while old != tree:
old = tree old = tree
@ -82,8 +86,14 @@ def process(tree, module_name):
return tree return tree
def load_macros(): def load_macros(module_name):
for module in MACROS: for module in CORE_MACROS:
__import__(module)
if module_name.startswith("hy.core"):
return
for module in EXTRA_MACROS:
__import__(module) __import__(module)

View File

@ -91,3 +91,11 @@
(assert initialized) (assert initialized)
(assert (test-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])))