2016-04-19 2 views
5

Возможно ли иметь что-то вроде понимания списка для создания сложных выражений в Джулии?Расширение списка-понимания как выражение внутри выражения Юлии?

Например, скажем, у меня есть некоторые символы и типы, и вы хотите создать из них тип. Прямо сейчас, я должен сделать что-то вроде.

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) 

и в конечном итоге с тем же выражением, как указано выше?

ответ

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) 
+0

Спасибо, я думаю, что я был на правильном пути, просто не мог получить правильный синтаксис. –

Смежные вопросы