2010-07-18 9 views
10

Estoy escribiendo algún código de Clojure que depende de un número de constantes.¿Cuál es el equivalente de Clojure de una constante "pública estática final" en Java

Se utilizarán dentro de bucles internos herméticos, por lo que es importante que se utilicen y optimicen de la forma más eficiente posible con la combinación Clojure del compilador + JVM. Normalmente usaría una constante "final estática pública" en Java para el mismo propósito.

¿Cuál es la mejor manera de declarar esto?

Respuesta

6

Creo que def -las cosas en el espacio de nombres global es lo más parecido posible.

+2

Agregar los metadatos: const hará que esté en línea en el tiempo de compilación, ver respuesta por @amalloy. Los defs globales son vars, que aunque cercanos, pueden ajustarse y resolverse en tiempo de ejecución. – deterb

2

como dijimos anteriormente use def o atom, recuerde, los datos son inmutables, por lo que si declara algunas constantes en una lista, no cambian.

+0

Si quisiera algo mutable, le pediría una constante y, de todos modos, normalmente haría una lista con átomos. Haría una lista de átomos o una lista de referencias. – nickik

2

No hay defconst, así que solo usar una definición global es idiomático; en lo que respecta a la optimización, el JIT hará las cosas rápidamente.

3

Si realmente, realmente, realmente desea la constante en su lugar (creo que el JIT notará que el valor es constante y hacer lo correcto, sin embargo), puede usar una macro.

(defmacro my-constant [] 5)

Esto es bastante feo, pero el rendimiento del código crítico siempre habrá feo, supongo.

(do-stuff (my-constant) in-place)

¡Sin embargo, importa lo que pongas en la macro! No quisiera esto por más que algunas constantes literales. En particular no objetos.

3

Si solo usa def no es lo suficientemente rápido, puede intentar crear un alias let enlazado antes de ingresar al lazo estrecho para evitar pasar por var cada vez.

+0

Gracias - ¿Estoy en lo correcto al decir que si no hace esto, terminará desreferenciando la var cada vez que se accede a la constante? – mikera

6

creo Clojure 1.3 (o tal vez 1.4) le permite poner una etiqueta en un ^:constantdef, lo que significa que el compilador que esta debe ser una constante y todas las referencias deben ser resueltos en tiempo de compilación.

Editar

Al parecer es Clojure 1.3, y es ^:const, no ^:constant. Ver How does Clojure ^:const work? para un resumen.

Cuestiones relacionadas