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
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)

View File

@ -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])))