【发布时间】:2018-12-09 11:25:56
【问题描述】:
为了说明,假设我有以下宏计算真值表中的行:
macro bool_to_lit(a)
eval(a) ? (x -> x) : (x -> !x)
end
macro make_clause(xs, bools, res)
lits = map((x -> @eval @bool_to_lit $x), bools.args)
clause_elements = map.(lits, xs.args)
and_res = all(push!(clause_elements, res))
return and_res
end
#@make_clause((false, false), (false, false), true) returns true
@bool_to_lit 根据参数的值返回一个闭包,@make_clause 使用结果来计算自己的值。但是,由于@make_clause 使用@eval,我的理解是它实际上运行@bool_to_lit(因此不只是执行语法转换)。
在这种情况下避免使用嵌套的@eval 会更好(如更快和生成更简洁的代码),这样整个宏树的整个结果在 rutime 只评估一次?
是否在更容易编码(即在使用@eval时将嵌套宏视为函数)之间进行权衡vs.正确性(即避免嵌套 @eval) 时只进行编译时语法转换?
【问题讨论】:
标签: macros julia eval dsl compile-time