2011-09-26 11 views
31

He visto los metadatos ^:static en bastantes funciones en el código fuente Clojure core.clj, p. en la definición de seq?:¿Qué hace "^: static" en 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))) 

Lo que precisamente hace este metadatos, y por qué se utiliza tan frecuentemente a lo largo core.clj?

Respuesta

34

En el desarrollo de Clojure 1.3 Rich quería añadir la capacidad de funciones para volver tipos diferentes de objetos. Esto permitiría que los operadores matemáticos nativos se usen sin tener que incluir todo en una función.

La implementación original requería funciones que admitieran que se marcara :static. estos metadatos hicieron que el compilador produjera dos versiones para la función, una que devolviera Object y otra que devolviera ese tipo específico. en los casos en que el compilador determinara que los tipos siempre coincidirían, se usaría la versión más específica.

Esto se hizo más tarde completamente automático, por lo que ya no es necesario que lo agregue.

+1

Cuando dice * completamente automático *, ¿quiere decir que en versiones recientes de compilador de clojure produce gemelos y realiza dicha optimización * para cada función * sin importar si está estática o no estática? –

+2

cuando las anotaciones de tipo hacen que el compilador determine que una función puede producir algo distinto de Object, entonces se generarán las otras formas. –