Skip to content

Commit fa1ac1f

Browse files
committed
lispy-python.py: Use f_locals before f_globals
1 parent df97f8e commit fa1ac1f

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

lispy-python.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,7 @@ def select_item(code: str, idx: int, _f: Optional[FrameType] = None) -> Any:
713713
locals_1 = locals()
714714
locals_2 = locals_1.copy()
715715
# pylint: disable=exec-used
716-
exec(f"{l} = list({r})[{idx}]", _f.f_globals, locals_2)
716+
exec(f"{l} = list({r})[{idx}]", _f.f_locals | _f.f_globals, locals_2)
717717
for bind in [k for k in locals_2.keys() if k not in locals_1.keys()]:
718718
_f.f_globals[bind] = locals_2[bind]
719719
# pylint: disable=eval-used
@@ -753,7 +753,7 @@ def to_elisp(code: str, _f: Optional[FrameType] = None) -> str:
753753
_f = _f or top_level()
754754
with io.StringIO() as buf, redirect_stdout(buf):
755755
# pylint: disable=eval-used
756-
print_elisp(eval(code, _f.f_globals))
756+
print_elisp(eval(code, _f.f_locals | _f.f_globals))
757757
return buf.getvalue().strip()
758758

759759
def translate(code: str, _f: Optional[FrameType] = None, use_in_expr: bool = False) -> Any:
@@ -793,19 +793,22 @@ def eval_code(_code: str, _env: Dict[str, Any] = {}) -> EvalResult:
793793
_locals = {}
794794
locals_1 = _locals
795795
locals_2 = locals_1.copy()
796+
locals_globals = _f.f_locals | _f.f_globals
797+
if "debug" in _env:
798+
print(f"{ast.unparse(last)=}")
796799
with io.StringIO() as buf, redirect_stdout(buf):
797800
if butlast:
798801
# pylint: disable=exec-used
799-
exec(ast.unparse(butlast), _f.f_globals, locals_2)
802+
exec(ast.unparse(butlast), locals_globals, locals_2)
800803
for bind in [k for k in locals_2.keys() if k not in locals_1.keys()]:
801804
_f.f_globals[bind] = locals_2[bind]
802805
try:
803806
# pylint: disable=eval-used
804-
_res = eval(ast.unparse(last), _f.f_globals, locals_2)
807+
_res = eval(ast.unparse(last), locals_globals, locals_2)
805808
except SyntaxError:
806809
locals_1 = _locals
807810
locals_2 = locals_1.copy()
808-
exec(ast.unparse(last), _f.f_globals, locals_2)
811+
exec(ast.unparse(last), locals_globals, locals_2)
809812
out = buf.getvalue().strip()
810813
binds1 = [k for k in locals_2.keys() if k not in locals_1.keys()]
811814
for bind in binds1:
@@ -820,6 +823,9 @@ def eval_code(_code: str, _env: Dict[str, Any] = {}) -> EvalResult:
820823
except Exception as e:
821824
err = f"{e.__class__.__name__}: {e}\n{e.__dict__}"
822825
_f.f_globals["e"] = e
826+
locs = e.__traceback__.tb_frame.f_locals.get("locals_2", {})
827+
for bind in locs:
828+
_f.f_globals[bind] = locs[bind]
823829
return {
824830
"res": to_str(_res) if _env.get("echo") else repr(_res),
825831
"binds": binds,

0 commit comments

Comments
 (0)