2012-03-15 9 views
12

Estoy tratando de entender el modelo de espacio de nombres en clojurescript. Entiendo que javascript no viene incorporado con soporte de espacio de nombres, por lo que ha sido un complemento a través de la biblioteca de cierre de google. Sin embargo, no entiendo cómo clojurescript trata estas diferencias. ¿Alguien puede explicar?¿Cuáles son los inconvenientes del espacio de nombres para clojurescript cuando provienen de clojure?

Digamos, por ejemplo, quiero utilizar la API de Google API y siempre que sea posible me gustaría utilizar la compilación avanzada. ¿Qué utilizo en la llamada closure/build, cómo se vería el formulario ns y cuál es la mejor manera de referirse a la API del código? Miré https://github.com/sritchie/contour pero ese ejemplo no usa compilación avanzada, y no veo las opciones que se refieren a la API de Google en el archivo project.clj.

Respuesta

12

La declaración del espacio de nombres es la misma independientemente de si está utilizando la compilación de modo simple o avanzado. La diferencia es que las bibliotecas que no participan en la administración de la dependencia de google a través de goog.require('') y goog.provide('') deben ser referenciadas explícitamente a través de un archivo externs.js. Este archivo, que pasa al compilador de cljs, proporciona stubs de todos los vars y métodos asociados. Un típico externs.js sería algo como:

// contents of externs.js 
var externalLibrary = {} 
var externalLibrary.method = function() {} 

Así que para hacer referencia a un cierre de la biblioteca cuenta Google su declaración de espacio se ve así:

(ns my.namespace 
    (:require [goog.events.KeyCodes :as key-codes]) 

Y que emite el siguiente javascript:

goog.provide("my.namespace"); 
goog.require("goog.events.keycodes"); 

Tenga en cuenta que si desea llamar a su script de cierre desde otro archivo javascript, debe etiquetar el método como exportado para que el compilador de optimización sepa s para preservar el nombre. (Por ejemplo, es posible que tenga una etiqueta de secuencia de comandos en una página desde la que desea llamar a una función javascript que se ha generado a partir de clojurescript)

que tiene este aspecto:

(defn ^:export externallyCalled []) 

La otra cosa a tener en cuenta es que tienes que tratar las macros de forma diferente en clojurescript, esto es porque la capacidad de procesarlas "sobre la marcha" en el lector no está presente de la misma manera que en clojure.

se hace eso de la siguiente manera (en cuenta que usted está obligado a unir las macros con: como en este caso)

(ns my.namespace 
    (:require-macros [my.macros :as my])) 

Si llama código que no participó en la gestión de la dependencia de Google puede acceder a él a través de la js espacio de nombres y la interoperabilidad Javascript ...

(. js/nonGoogle (method args)) ; a method access 

(. js/nonGoogle -p) ; a property access 

todos los habituales. las variantes también funcionan ..

+0

es la opción: como compatible con: uso? también se supone que hay un vector en el ejemplo: requre-macros? Además, ¿podría dar un ejemplo con la API de google maps o charts? – bmillare

+0

@bmillare son buenas capturas. Arreglé la respuesta. Gracias (mucho tarde) – sw1nn

Cuestiones relacionadas