Haxe для JavaScript без загрязнения глобального пространства имен?

Этот вопрос относится только к Haxe версии <2.10

Я знал о haxe некоторое время, но никогда не играл с ним до вчерашнего дня. Будучи любопытным, я решил портироватьshowdown.jsпорт javascriptmarkdown.plхакнуть Это было довольно просто, и генерируемый JavaScript, кажется, работает нормально (редактировать:&nbsp;Если вы хотите увидеть это в действии, проверьте этоВот).

Однако я заметил, что сгенерированный код сбрасывает кучу вещей в глобальном пространстве имен ... и, что еще хуже, он делает это, присваивая значениянеобъявленные идентификаторы&nbsp;без использованияvar&nbsp;ключевое слово, так что они глобальны, даже если вы закроете их целиком.

Например...

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

Мне удалось очистить большую часть этого с помощью sed, но меня также беспокоит такая вещь:

{
 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);
 }
}

Это довольно неприятный JavaScript.

Вопросы

Есть ли где-нибудь вилка или клон haxe, который не загрязняет глобалы? Стоит ли модифицировать источник haxe, чтобы получить то, что я хочу, или кто-то уже решил это? Погуглил мало что нашел. Я открыт для любых предложений. Между тем мне не терпится увидеть, какой код PHP эта штука будет производить ...: D

Ответы?

Вот некоторые из идей, которые я попробовал:

Постобработка

Вот мой скромный сценарий сборки; он делает довольно хорошую работу по удалению вещей, но не все ловит. Я не решаюсь удалить модификации встроенных прототипов конструктора; Я уверен, что это сломало бы вещи. Исправление всего может быть немного трудной задачей, и я не хочу начинать это, если кто-то уже сделал работу ...

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 спасает день

Спасибо Дину Берджу за то, что он указал на переключатель пространства имен. Это в значительной степени решило мою проблему с небольшой помощью. Вот мой текущий скрипт сборки. ясчитать&nbsp;это ловит все глобальные переменные ...

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;