Есть ли способ получить имя из окружения при использовании hy.eval? - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь создать функции в hylang и использовать их из python, но созданные функции, похоже, не имеют доступа к среде, переданной в hy.eval.

import hy

env = dict(x=5)
func = hy.eval(hy.read_str('(fn [] x)'), env)
print(func())

Вызов на func приводит к NameError: name 'x' is not defined. Я также безуспешно пробовал

hy.eval(hy.read_str('(func)'), env)

(та же ошибка). Есть идеи?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

hy.eval не имеет параметра globals, но имеет параметр module, и, посмотрев на источник, я обнаружил, что module.__dict__ передается как globals в eval. Так работает:

import hy
from types import ModuleType

env = dict(x=5)
module = ModuleType('<string>')
module.__dict__.update(env)
func = hy.eval(hy.read_str('(fn [] x)'), module=module)
print(func())
1 голос
/ 27 мая 2020

Первый параметр hy.eval равен locals, а не globals, как для Python eval. Однако неявное использование вызывающей среды работает нормально, поэтому вы можете записать это более просто как

 import hy

 x = 5
 func = hy.eval(hy.read_str('(fn [] x)'))
 print(func())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...