如何在Julia中对基于表达式构造的匿名函数传值求值
问题根源
你现有写法的逻辑存在两层问题:
- 匿名函数
(x,y,z)->expr本身的功能就是直接返回外部变量expr(也就是你的表达式对象),没有任何求值逻辑 eval作用在已经定义好的函数对象上不会产生任何修改,返回的还是同一个返回表达式的函数,调用自然得不到计算结果
正确实现方案
方案1:构造时展开表达式(推荐,性能无损)
在构造函数的时候用表达式插值把计算逻辑拼入函数体,再执行eval,生成的函数性能和手写的普通函数完全一致:
expr = :(x + y) # 用$把expr插值到函数定义的表达式中,再eval生成最终函数 f = eval(:( (x,y,z) -> $expr ))
调用验证:
julia> f(1,2,3) 3
如果需要批量构造多个函数,这个方案也可以直接套用,只需要循环替换expr的内容即可。
方案2:运行时动态求值(不推荐,性能低)
如果确实需要每次调用函数时都对最新的表达式求值,可以使用局部作用域绑定变量后求值,但是每次调用都会有表达式解析的开销,性能比方案1低几个数量级:
expr = :(x + y) f = function (x,y,z) @eval let x=$x, y=$y $expr end end
调用验证:
julia> f(1,2,3) 3
内容的提问来源于stack exchange,提问作者Sean C
相关产品推荐
相关产品推荐

