2011-09-26 15 views
31

Ho visto i metadati ^:static su alcune funzioni nel codice sorgente di Clojure core.clj, ad es. nella definizione di seq?:Cosa fa "^: static" in Clojure?

(def 
^{:arglists '([x]) 
    :doc "Return true if x implements ISeq" 
    :added "1.0" 
    :static true} 
seq? (fn ^:static seq? [x] (instance? clojure.lang.ISeq x))) 

cosa esattamente fa questo metadati fare, e perché è usato così spesso durante core.clj?

risposta

34

Nello sviluppo di Clojure 1.3 Rich ha voluto aggiungere la possibilità per le funzioni di restituire tipi diversi oggetti. Ciò consentirebbe agli operatori matematici nativi di essere utilizzati senza dover stipare tutto in un'unica funzione.

L'implementazione originale richiedeva che le funzioni supportate fossero contrassegnate come :static. questo metadati ha indotto il compilatore a produrre due versioni della funzione, una che restituiva Object e una che restituiva quel tipo specifico. nei casi in cui il compilatore ha determinato che i tipi corrispondessero sempre alla versione più specifica verrebbe utilizzata.

Questo è stato successivamente reso completamente automatico, quindi non è necessario aggiungerlo più.

+1

Quando si dice * completamente automatico *, si intende che nelle versioni recenti del compilatore clojure produce due gemelli ed esegue tale ottimizzazione * per ogni funzione * non contrassegnata con^statico o no? –

+2

quando le annotazioni di tipo fanno sì che il compilatore determini che una funzione può produrre qualcosa di diverso da Object, quindi verranno generate le altre forme. –