Allow for
with an empty body
This commit is contained in:
parent
b7e5c5f17a
commit
ec1c92bf4e
1
NEWS.rst
1
NEWS.rst
@ -39,6 +39,7 @@ New Features
|
|||||||
* `defclass` in Python 3 now supports specifying metaclasses and other
|
* `defclass` in Python 3 now supports specifying metaclasses and other
|
||||||
keyword arguments
|
keyword arguments
|
||||||
* Added a command-line option `-E` per CPython
|
* Added a command-line option `-E` per CPython
|
||||||
|
* `while` and `for` are allowed to have empty bodies
|
||||||
|
|
||||||
Bug Fixes
|
Bug Fixes
|
||||||
------------------------------
|
------------------------------
|
||||||
|
@ -1820,7 +1820,7 @@ class HyASTCompiler(object):
|
|||||||
ret += node(expression,
|
ret += node(expression,
|
||||||
target=target,
|
target=target,
|
||||||
iter=ret.force_expr,
|
iter=ret.force_expr,
|
||||||
body=body.stmts,
|
body=body.stmts or [asty.Pass(expression)],
|
||||||
orelse=orel.stmts)
|
orelse=orel.stmts)
|
||||||
|
|
||||||
ret.contains_yield = body.contains_yield
|
ret.contains_yield = body.contains_yield
|
||||||
|
@ -110,15 +110,11 @@ used as the result."
|
|||||||
|
|
||||||
(defn _for [node args body]
|
(defn _for [node args body]
|
||||||
(setv body (list body))
|
(setv body (list body))
|
||||||
(if (empty? body)
|
(setv belse (if (and body (isinstance (get body -1) HyExpression) (= (get body -1 0) "else"))
|
||||||
(macro-error None "`for' requires a body to evaluate"))
|
|
||||||
(setv lst (get body -1))
|
|
||||||
(setv belse (if (and (isinstance lst HyExpression) (= (get lst 0) "else"))
|
|
||||||
[(body.pop)]
|
[(body.pop)]
|
||||||
[]))
|
[]))
|
||||||
(if
|
(if
|
||||||
(odd? (len args)) (macro-error args "`for' requires an even number of args.")
|
(odd? (len args)) (macro-error args "`for' requires an even number of args.")
|
||||||
(empty? body) (macro-error None "`for' requires a body to evaluate")
|
|
||||||
(empty? args) `(do ~@body ~@belse)
|
(empty? args) `(do ~@body ~@belse)
|
||||||
(= (len args) 2) `(~node [~@args] (do ~@body) ~@belse)
|
(= (len args) 2) `(~node [~@args] (do ~@body) ~@belse)
|
||||||
(do
|
(do
|
||||||
|
@ -534,14 +534,6 @@ def test_for_compile_error():
|
|||||||
can_compile("(fn [] (for [x] x))")
|
can_compile("(fn [] (for [x] x))")
|
||||||
assert excinfo.value.message == "`for' requires an even number of args."
|
assert excinfo.value.message == "`for' requires an even number of args."
|
||||||
|
|
||||||
with pytest.raises(HyTypeError) as excinfo:
|
|
||||||
can_compile("(fn [] (for [x xx]))")
|
|
||||||
assert excinfo.value.message == "`for' requires a body to evaluate"
|
|
||||||
|
|
||||||
with pytest.raises(HyTypeError) as excinfo:
|
|
||||||
can_compile("(fn [] (for [x xx] (else 1)))")
|
|
||||||
assert excinfo.value.message == "`for' requires a body to evaluate"
|
|
||||||
|
|
||||||
|
|
||||||
def test_attribute_access():
|
def test_attribute_access():
|
||||||
"""Ensure attribute access compiles correctly"""
|
"""Ensure attribute access compiles correctly"""
|
||||||
|
@ -232,7 +232,15 @@
|
|||||||
(assert (= (list ((fn [] (for [x [[1] [2 3]] y x] (yield y)))))
|
(assert (= (list ((fn [] (for [x [[1] [2 3]] y x] (yield y)))))
|
||||||
(list-comp y [x [[1] [2 3]] y x])))
|
(list-comp y [x [[1] [2 3]] y x])))
|
||||||
(assert (= (list ((fn [] (for [x [[1] [2 3]] y x z (range 5)] (yield z)))))
|
(assert (= (list ((fn [] (for [x [[1] [2 3]] y x z (range 5)] (yield z)))))
|
||||||
(list-comp z [x [[1] [2 3]] y x z (range 5)]))))
|
(list-comp z [x [[1] [2 3]] y x z (range 5)])))
|
||||||
|
|
||||||
|
(setv l [])
|
||||||
|
(defn f []
|
||||||
|
(for [x [4 9 2]]
|
||||||
|
(.append l (* 10 x))
|
||||||
|
(yield x)))
|
||||||
|
(for [_ (f)])
|
||||||
|
(assert (= l [40 90 20])))
|
||||||
|
|
||||||
|
|
||||||
(defn test-nasty-for-nesting []
|
(defn test-nasty-for-nesting []
|
||||||
|
Loading…
Reference in New Issue
Block a user