是否有可能在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)]
Run Code Online (Sandbox Code Playgroud)
这适用于new_type包含的表达式
:(type Foo
a::Int64
b::Float32
c::Char
end)
Run Code Online (Sandbox Code Playgroud)
但是构建像这样的复杂表达式都非常容易出错(因为你对Expr数据类型非常了解,以便知道,例如必须存储元组的数据类型的表达式new_type.args[3].args),并且在那里也非常脆弱.对正在构建的表达式的AST的任何更改都意味着必须更改每个子表达式的存储位置.
有没有办法做类似的事情
:(type Foo
$(sym::typ for (sym,typ) in zip(syms,typs))
end)
Run Code Online (Sandbox Code Playgroud)
并最终得到与上面相同的表达?
是的,您可以将表达式数组直接映射到语法中:
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)
Run Code Online (Sandbox Code Playgroud)