2015-05-24 8 views
6

In Julia, c'è un modo per scrivere una macro che si dirama in base al tipo (in fase di compilazione) dei suoi argomenti, almeno per gli argomenti i cui tipi possono essere dedotti in fase di compilazione? Come nell'esempio seguente, ho creato una funzione denominata code_type che restituisce il tipo in fase di compilazione di x. Esiste qualche funzione del genere o un modo per produrre questo tipo di comportamento? (O se le macro vengono espansa prima tipi sono desunti, in modo tale che questo genere di cose è impossibile.)In Julia, una macro può accedere al tipo dedotto dei suoi argomenti?

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

risposta

8

macro non possono fare questo, ma generato funzioni.

Scopri i documenti qui: http://julia.readthedocs.org/en/latest/manual/metaprogramming/#generated-functions

+2

Solo una piccola nota pedante: le funzioni generate operano sui tipi effettivi dei suoi argomenti e non solo sui tipi dedotti. (I due sono gli stessi se la funzione è di tipo stabile). –

+0

Buon punto. Dovrei anche dire che questo è disponibile solo su build recenti di 0.4dev. – spencerlyon2

4

Oltre alla risposta di spencerlyon2, un'altra opzione è di generare solo rami espliciti:

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

Se @report_int(x) viene utilizzato all'interno di una funzione, e il tipo di x può essere dedotto, quindi la JIT sarà in grado di ottimizzare il ramo morto (questo approccio è usato dallo @evalpoly macro nella libreria standard).

Problemi correlati