Haxe para javascript sin contaminación global del espacio de nombres?

Esta pregunta solo se aplica a la versión Haxe <2.10

Hace tiempo que conozco el haxe, pero nunca jugué con él hasta ayer. Siendo curioso, decidí portarshowdown.js, un puerto javascript demarkdown.plhaxe Esto fue bastante sencillo, y el javascript que genera parece funcionar bien (editar: Si quieres verlo en acción, échale un vistazoaquí)

Sin embargo, noté que el código generado volca un montón de cosas en el espacio de nombres global ... y lo que es peor, lo hace asignando valores aidentificadores no declarados sin usar elvar palabra clave, por lo que son globales incluso si envuelve todo con un cierre.

Por ejemplo...

if(typeof js=='undefined') js = {}
...
Hash = function(p) { if( p === $_ ) return; {
...
EReg = function(r,opt) { if( r === $_ ) return; {
...

Logré limpiar la mayor parte de eso con sed, pero también me molestan cosas como esta:

{
 String.prototype.__class__ = String;
 String.__name__ = ["String"];
 Array.prototype.__class__ = Array;
 Array.__name__ = ["Array"];
 Int = { __name__ : ["Int"]}
 Dynamic = { __name__ : ["Dynamic"]}
 Float = Number;
 Float.__name__ = ["Float"];
 Bool = { __ename__ : ["Bool"]}
 Class = { __name__ : ["Class"]}
 Enum = { }
 Void = { __ename__ : ["Void"]}
}
{
 Math.__name__ = ["Math"];
 Math.NaN = Number["NaN"];
 Math.NEGATIVE_INFINITY = Number["NEGATIVE_INFINITY"];
 Math.POSITIVE_INFINITY = Number["POSITIVE_INFINITY"];
 Math.isFinite = function(i) {
  return isFinite(i);
 }
 Math.isNaN = function(i) {
  return isNaN(i);
 }
}

Este es un javascript bastante desagradable.

Preguntas

¿Hay un tenedor o clon de haxe en algún lugar que no contamine a los globales? ¿Vale la pena modificar la fuente haxe para obtener lo que quiero, o alguien ya ha resuelto esto? Buscar en Google no ha aparecido mucho. Estoy abierto a cualquier sugerencia. Mientras tanto, me muero por ver qué tipo de código PHP producirá esto ...: D

Respuestas?

Estas son algunas de las ideas que he probado:

Postprocesamiento

Aquí está mi humilde script de compilación; hace un muy buen trabajo eliminando cosas, pero no atrapa todo. Dudo en eliminar las modificaciones a los prototipos de constructor integrados; Estoy seguro de que eso rompería las cosas. Arreglar todo puede ser una tarea difícil, y no quiero comenzar si alguien ya ha hecho el trabajo ...

haxe -cp ~/Projects/wmd-new -main Markdown -js markdown.js

echo "this.Markdown=(function(){ var \$closure, Float;" > markdown.clean.js;

sed "s/^if(typeof js=='undefined') js = {}$/if(typeof js=='undefined') var js = {};/g ;
     s/^\([ \x09]*\)\([\$_a-zA-Z0-9]* = \({\|function\)\)/\1var \2/g ;
      /^[ \x09]*\(else \)\?null;$/d ;
     " markdown.js >> markdown.clean.js

echo "return Markdown}());" >> markdown.clean.js;

java -jar closure/compiler.jar --js markdown.clean.js \
--compilation_level SIMPLE_OPTIMIZATIONS \
> markdown.cc.js

--js-namespace switch salva el día

Gracias a Dean Burge por señalar el cambio de espacio de nombres. Esto resolvió mi problema, con un poco de ayuda. Aquí está mi script de compilación actual. yopensar esto atrapa todas las variables globales ...

NS=N\$

haxe -cp ~/Projects/wmd-new -main Markdown --js-namespace $NS -js markdown.js 

# export our function and declare some vars
echo "this.markdown=(function(){var \$_,\$Main,\$closure,\$estr,js,"$NS"" > markdown.clean.js;

# strip silly lines containing "null;" or "else null;"
sed "/^[ \x09]*\(else \)\?null;$/d ;" markdown.js >> markdown.clean.js

# finish the closure
echo "return "$NS".Markdown.makeHtml}());" >> markdown.clean.js;

Respuestas a la pregunta(4)

Su respuesta a la pregunta