mapa insertar gratis google georreferenciación ejemplos map clojure language-implementation

insertar - google maps html5



¿Por qué el enlace afecta el tipo de mi mapa? (1)

Esta pregunta me hizo profundizar en el código fuente de Clojure. Acabo de pasar algunas horas escribiendo declaraciones de impresión en la fuente para resolver esto.

Resulta que las dos expresiones de mapa se evalúan a través de diferentes rutas de código

(type {:a 1}) hace que se emita y se ejecute el byte-código de Java. El código emitido utiliza clojure.lang.RT.map() para construir el mapa que devuelve un PersistentArrayMap para mapas pequeños:

static public IPersistentMap map(Object... init){ if(init == null) return PersistentArrayMap.EMPTY; else if(init.length <= PersistentArrayMap.HASHTABLE_THRESHOLD) return PersistentArrayMap.createWithCheck(init); return PersistentHashMap.createWithCheck(init); }

Al evaluar (def x {:a 1}) al menos desde el REPL, no hay un código de byte emitido. El mapa constante se analiza como un PersistentHashMap en clojure.lang.Compiler$MapExpr.parse() que lo devuelve warpped en un ConstantExpr :

else if(constant) { IPersistentMap m = PersistentHashMap.EMPTY; for(int i=0;i<keyvals.length();i+= 2) { m = m.assoc(((LiteralExpr)keyvals.nth(i)).val(), ((LiteralExpr)keyvals.nth(i+1)).val()); } //System.err.println("Constant: " + m); return new ConstantExpr(m); }

La expresión def cuando se evalúa enlaza el valor del ConstantExpr creado arriba que, como se dijo, es un PersistentHashMap .

Entonces, ¿por qué se implementa de esta manera?

No lo sé. Podría ser una simple supervisión o la optimización de PersistentArrayMap podría no valer la pena.

Estaba jugando en el REPL y tengo un comportamiento extraño:

Clojure 1.4.0 user=> (type {:a 1}) clojure.lang.PersistentArrayMap user=> (def x {:a 1}) #''user/x user=> (type x) clojure.lang.PersistentHashMap

Pensé que todos los pequeños mapas literales eran ejemplos de PersistentArrayMap , pero aparentemente ese no es el caso si se ha vinculado con def . ¿Por qué utilizar def causa Clojure para elegir una representación diferente para mi pequeño mapa? Sé que probablemente sea solo un extraño detalle de implementación, pero tengo curiosidad.