2016-04-19 14 views
5

Czy można mieć coś w rodzaju rozumienia listy do budowania skomplikowanych wyrażeń w Julia?Ekspansja podobna do listy w wyrażeniu Julia?

Na przykład powiedz, że mam pewne symbole i typy i chcę zbudować z nich typ. Teraz muszę coś zrobić.

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

Działa to w tym new_type jest wyrazem zawierający

:(type Foo 
    a::Int64 
    b::Float32 
    c::Char 
end) 

Ale rozbudowanych wyrażeń jak to jest zarówno niezwykle podatny na błędy (bo trzeba być ściśle wiedzę z typem Expr danych w celu poznania , np. że wyrażenia dla typów danych krotki muszą być przechowywane w new_type.args[3].args), a także bardzo kruche pod względem tego, że każda zmiana w AST budowanej ekspresji będzie oznaczać konieczność zmiany gdzie/jak przechowywane jest każde podekspresję.

Więc czy jest jakiś sposób, aby zrobić coś podobnego

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

i skończyć z tym samym wyrazem jak powyżej?

Odpowiedz

5

Tak, można splat tablice wyrażeń bezpośrednio w składni:

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

Dzięki, myślę, że jestem na dobrej drodze, po prostu nie mógł uzyskać prawo składni. –