2011-06-26 19 views
8

Parece que los dos hacen lo mismo en Clojure. ¿Qué sintaxis es canónica?Escriba el valor de retorno de sugerencia con^o: meta de etiqueta?

(defn a ^int [] 4) 

(defn b ^{:tag int} [] 4) 

Espero que sea a porque es más corto.

+1

En realidad, la función de teclear una función en int ya no funciona. todo es largo y doble. Y hay todas las combinaciones posibles agregadas aquí: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/IFn.java#L97 Y no es tan loco como parece. – claj

+0

@claj Querido Dios, espero que el código se haya generado de alguna manera. De lo contrario, siento pena por la pobre savia que se quedó atrapada en ese trabajo. – Carcigenicate

+0

Probablemente una combinación de https://github.com/clojure/math.combinatorics y https://clojuredocs.org/clojure.pprint/cl-format – claj

Respuesta

8

Solo uso b cuando necesito incluir metadatos que no sean solo la etiqueta. Por ejemplo, al aplicar una colección transitoria, que necesitaba

(deftype Whatever [^{:tag ITransientVector 
        :unsynchronized-mutable true} foo]) 

Nota que sería equivalente y perfectamente aceptable para escribir

(deftype Whatever [^:unsynchronized-mutable ^ITransientVector foo]) 

pero yo personalmente prefiero el mapa explícito.

5

Su 'a' es canónico. Es el único que he visto hasta ahora en el código de Clojure y en la documentación en el sitio de Clojure. Consulte here para obtener más información sobre sugerencias de tipo.

Espero que esto ayude.

+3

Estaría muy sorprendido si hay una diferencia de velocidad. Puede * compilar un pelo más rápido, pero debería funcionar igual, y la compilación solo ocurre una vez. ¿Tiene a mano el punto de referencia que utilizó para probar esto? – amalloy

+0

+1 Su derecha, probada de nuevo y el tiempo que tardó en variar para mí, pero se ven los dos son similares, por lo que probablemente no aumente la velocidad. Publicación editada en consecuencia. – adamjmarkham

+2

+1. También vale la pena señalar que (a) es en realidad solo azúcar sintáctica para (b) por lo que producen los mismos resultados en tiempo de ejecución. – mikera