在Julia中构建复杂表达式是否有可能具有类似列表理解的东西?
例如,假设我有一些符号和类型,并希望从中构建一个类型。现在,我必须做类似的事情。
syms = [:a, :b, :c]
typs = [Int, Float32, Char]
new_type = :(type Foo end)
new_type.args[3].args = [:($sym::$typ) for (sym,typ) in zip(syms,typs)]
这适用于new_type
是包含
:(type Foo
a::Int64
b::Float32
c::Char
end)
但是构建这样复杂的表达式非常容易出错(因为你对Expr
数据类型非常了解,以便知道,例如必须存储元组数据类型的表达式在new_type.args[3].args
)并且非常脆弱,因为对正在构建的表达式的AST的任何改变都意味着必须改变存储每个子表达式的位置/方式。
有没有办法做类似
的事情:(type Foo
$(sym::typ for (sym,typ) in zip(syms,typs))
end)
并最终使用与上面相同的表达式?
答案 0 :(得分:5)
是的,您可以将表达式数组直接打印到语法中:
julia> :(type Foo
$([:($sym::$typ) for (sym,typ) in zip(syms,typs)]...)
end)
:(type Foo # none, line 2:
a::Int64
b::Float32
c::Char
end)