0

我正在尝试在 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)

没有运气(同样的错误)。有任何想法吗?

4

2 回答 2

1

的第一个参数hy.evallocals,而不是globalsPython 的eval. 但是,隐式使用调用环境可以正常工作,因此您可以更直接地将其编写为

 import hy

 x = 5
 func = hy.eval(hy.read_str('(fn [] x)'))
 print(func())
于 2020-05-27T19:28:11.490 回答
1

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())
于 2020-05-28T09:44:13.727 回答