2015-05-24 10 views
6

Czy w Julii istnieje możliwość napisania makra rozgałęziającego się w oparciu o typ argumentów (kompilacji), przynajmniej dla argumentów, których typy można wywnioskować w czasie kompilacji? Podobnie jak w poniższym przykładzie, utworzyłem funkcję o nazwie code_type, która zwraca typ kompilacji x. Czy istnieje jakakolwiek taka funkcja lub jakikolwiek sposób na wytworzenie tego rodzaju zachowania? (Albo czy makra rozszerzył się przed typy wywnioskować, tak że tego typu rzeczy jest niemożliwe.)W Julia, czy makro może uzyskać dostęp do wywnioskowanego typu jego argumentów?

macro report_int(x) 
    code_type(x) == Int64 ? "it's an int" : "not an int" 
end 

Odpowiedz

8

Makra nie może tego zrobić, ale generowane funkcje.

Sprawdź docs tutaj: http://julia.readthedocs.org/en/latest/manual/metaprogramming/#generated-functions

+2

Po prostu pomniejsza notatka pedantyczna: wygenerowane funkcje działają na faktycznych typach argumentów, a nie tylko na podstawie wnioskowanych typów. (Te dwa są takie same, jeśli funkcja jest stabilna). –

+0

Dobra uwaga. Powinienem też wspomnieć, że jest to dostępne tylko w najnowszych wersjach 0.4dev. – spencerlyon2

4

Oprócz odpowiedzi spencerlyon2, w innym rozwiązaniem jest po prostu generuje wyraźne oddziały:

macro report_int(x) 
    :(isa(x,Int64) ? "it's an int" : "not an int") 
end 

Jeśli @report_int(x) stosowany jest wewnątrz funkcji, a typ x można wywnioskować, wtedy JIT będzie mógł zoptymalizować martwą gałąź (to podejście jest używane przez @evalpoly macro w standardowej bibliotece).

Powiązane problemy