Skip to content

Commit

Permalink
Fix #1041 (eval should use globals + locals)
Browse files Browse the repository at this point in the history
  • Loading branch information
refi64 committed Apr 12, 2016
1 parent 9d6e04f commit 809861c
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 2 deletions.
16 changes: 15 additions & 1 deletion hy/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -746,7 +746,21 @@ def compile_eval(self, expr):
if len(expr) >= 2:
elist.append(expr[1])
else:
elist.append(HyExpression([HySymbol("locals")]))
dct = HySymbol(self.get_anon_var())
it = HySymbol(self.get_anon_var())

# Merge globals and locals, with locals taking precedence.
# Equivalent to (genexpr i [dct [(globals) (locals)] i (.items d)]).
genexpr_arg = HyList([HySymbol(dct),
HyList([HyExpression([HySymbol("globals")]),
HyExpression([HySymbol("locals")])]),
HySymbol(it),
HyExpression([HySymbol(".items"), dct])])

elist.append(HyExpression([HySymbol("dict"),
HyExpression([HySymbol("genexpr"),
it,
genexpr_arg])]))

if len(expr) == 3:
elist.append(expr[2])
Expand Down
3 changes: 2 additions & 1 deletion tests/native_tests/language.hy
Original file line number Diff line number Diff line change
Expand Up @@ -987,7 +987,8 @@
(setv x (quote 42))
(assert (= x (eval x)))
(assert (= 27 (eval (+ (quote (*)) (* [(quote 3)] 3)))))
(assert (= None (eval (quote (print ""))))))
(assert (= None (eval (quote (print "")))))
(assert (= sys (eval (quote sys))))) ; issue #1041


(defn test-eval-globals []
Expand Down

0 comments on commit 809861c

Please sign in to comment.