列表理解式扩展内部朱莉娅表达?

时间:2016-04-19 05:33:19

标签: julia

在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)

并最终使用与上面相同的表达式?

1 个答案:

答案 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)
相关问题