【问题标题】:list-comprehension-like expansion inside Julia expression?Julia 表达式中类似列表理解的扩展?
【发布时间】:2016-04-19 05:33:19
【问题描述】:

在 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 数据类型以便知道,例如元组的数据类型的表达式必须存储在@ 987654325@) 并且非常脆弱,因为对正在构建的表达式的 AST 进行任何更改都意味着必须更改每个子表达式的存储位置/方式。

那么有没有办法做类似的事情

:(type Foo
    $(sym::typ for (sym,typ) in zip(syms,typs))
end)

最后得到和上面一样的表达式?

【问题讨论】:

    标签: julia


    【解决方案1】:

    是的,您可以将表达式数组直接添加到语法中:

    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)
    

    【讨论】:

    • 谢谢,我想我是在正确的轨道上,只是无法获得正确的语法。
    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多