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

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

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

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

Например...

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

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

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;

Ответы на вопрос(4)

Ваш ответ на вопрос