JSXを使ってみたよ

朝起きたらJSX!JSX!なんてTwitterのTLに流れてるものだからなんだろうと思ったら、
静的型付けでOOPJava風のコードを「速い」JavaScriptのコードに変換してくれるコンパイラみたい(あってるのかな?)
んで、さっそく試してみたのですよー。
環境:WindowsXP SP3 / node 0.6.17 / npm 1.1.21

リポジトリを持ってくる

gitで持ってくるですよー。

$ git clone http://github.com/jsx/JSX.git
$ cd JSX/
$ npm install

npm installでモジュールを入れているけど、本当はmake setupするところなのです……
でも中でperlを使っているようなので直にnpm installを叩いてます。

コードを書いてみる

// aaa.jsx
class _Main {
  static function main(args: string[]): void {
    log "Hello, World!";
  }
}

チュートリアルにあったコードをそのまま書いてみた。
型の書き方がPascal, Scalaぽい。括弧省けるならセミコロンも省けると良かったかな……
まだちゃんと調べてないから本当は省けるのかもしれないけど。

コンパイルする

shebangも書いてあるのだけど、Windowsなのでアレなので直にnode.jsから実行します。

$ node bin/jsx aaa.jsx

これで実行すると標準出力に表示されます。

出力されたコード

var JSX = {};

(function () {



/**

 * copies the implementations from source interface to target

 */

function $__jsx_merge_interface(target, source) {

	for (var k in source.prototype)

		if (source.prototype.hasOwnProperty(k))

			target.prototype[k] = source.prototype[k];

}



/**

 * defers the initialization of the property

 */

function $__jsx_lazy_init(obj, prop, func) {

	function reset(obj, prop, value) {

		Object.defineProperty(obj, prop, {

			value: value, 

			enumerable: true,

			writable: true,

			configurable: true

		});

		return value;

	}



	Object.defineProperty(obj, prop, {

		get: function () {

			return reset(obj, prop, func());

		},

		set: function (v) {

			reset(obj, prop, v);

		},

		enumerable: true,

		configurable: true

	});

}



/*

 * global functions called by JSX as Number.* (renamed so that they do not conflict with local variable names)

 */

var $__jsx_parseInt = parseInt;

var $__jsx_parseFloat = parseFloat;

var $__jsx_isNaN = isNaN;

var $__jsx_isFinite = isFinite;



var $__jsx_ObjectToString = Object.prototype.toString;

var $__jsx_ObjectHasOwnProperty = Object.prototype.hasOwnProperty;



/*

 * public interface to JSX code

 */

JSX.require = function (path) {

	var m = $__jsx_classMap[path];

	return m !== undefined ? m : null;

}

/**
 * class _Main extends Object
 * @constructor
 */
function _Main() {
}

_Main.prototype = new Object;
/**
 * @constructor
 */
function _Main$() {
};

_Main$.prototype = new _Main;

/**
 * @param {Array.<undefined|!string>} args
 */
_Main.main$AS = function (args) {
	console.log("Hello, World!");
};

_Main$main$AS = _Main.main$AS;

var $__jsx_classMap = {
	"..\aaa.jsx": {
		_Main: _Main,
		_Main$: _Main$
	}
};


}());

こんな感じ。みたい。
Windowsだからなのかな、LFのファイルなんだけどCRが最初の方にまじってる。


Vimな人はjsx.vimシンタックスハイライト出来るみたい。
jsx-mode.elもどこかにあるみたいだけど……


デバッグも--enable-source-mapを指定するとChromeで出来るみたい。


多人数での開発はやっぱりこういう言語の方がいいのかなー。