diff --git a/hy/compiler.py b/hy/compiler.py index 17b7fbd06..969f87826 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -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]) diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index 0300ffbb8..b2900b3d3 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -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 []