如何创建在Julia中评估为Expr的Expr?

时间:2018-11-20 21:24:12

标签: julia metaprogramming

我有一个表示Expr的变量ex,我想有一个函数exprwrap从中创建一个Expr,当求值等于ex时。

目前,我将其实现如下:

ex = :(my + expr)

"Make an expression that when evaled returns the input ex."
function exprwrap(ex::Expr)
  ret = :(:(du + mmy))
  ret.args[1] = ex
  ret
end

eval(exprwrap(ex)) == ex

请记住,没有定义myexpr,因此:(:($$ex))不能完成工作。

什么是更干净的方法?

1 个答案:

答案 0 :(得分:3)

您可以写:

Expr(:quote, x)

Expr(:block, ex)

:($ex;)

您还可以:

Meta.parse(":($ex)")

这并不简单,但是向您展示了Julia在源代码中出现时如何解析ex,并且您可以看到它与Expr(:quote, ex)相同。

同样,您可以检查Meta.parse("($ex;)") == Expr(:block, ex)