JavaScriptに変換される新しい言語「Mican」を作りました!
この記事は altjs Advent Calendar 2012の8日目です。
今回は私が以前から作っていた、JavaScriptにコンパイルされるaltjsとなる新しい言語について紹介します。
言語の紹介
この言語は簡単に言うと、RubyとPythonのいいところを取り入れた、JavaScriptの代わりに使える言語です。
今はまだ機能も少なく不安定な部分もありますが、これから少しずつ開発を進めていきたいと思います。
機能紹介
- Pythonのようなインデント表記
def func(x): x + 1
- JavaScriptのような中かっこを使った表記
上のプログラムは、この表記と同じ意味になります。
def func(x) { x + 1 }
- Rubyのようなブロック付き呼び出し
map([1, 2, 3]): |a| console.log(a)
または
map([4, 5, 6]) {|a| console.log(a) }
のようにブロック付きの関数呼び出しが使えます。
ただし、これはJavaScriptのaddEventListenerのようなメソッドに使えるようにするため、
map([1, 2, 3], fun(a) -> console.log(a))
という無名関数を最後に付けた呼び出しに変換されます。
ちなみにこれも
map([1, 2, 3], fun(a) { console.log(a) })
の別の表記です。
- 可変長引数の簡単な表記
def func(a, b, *rest) console.log(a) console.log(b) console.log(rest) func(1, 2, 3, 4, 5, 6, 7, 8, 9)
このように、最後の引数名の最初に*を付けると、その引数に配列として渡されます。
このプログラムは
1 2 [ 3, 4, 5, 6, 7, 8, 9 ]
という出力をします。
- クラス
class Parent: def new(): console.log("Constructor of Parent") def a(): console.log("a") class Child extends Parent: def new(): super() console.log("Constructor of Child") def a(): console.log("a of Child") child = new Child() child.a()
このプログラムでは、メソッドaを持ったParentクラスを作り、それを継承してコンストラクタとaをオーバーライドしたChildクラスを作っています。
JavaScriptはプロトタイプベースですが、よりクラスベースに近い表記を目指しました。
サンプルプログラム
いくつかサンプルプログラムを紹介します。
a = 0; while a < 5: console.log("Loop! " + a.toString()) a = a + 1 for b in [1, 2, 3, 4]: console.log(b)
ループにはwhileとfor inが使えますが、for inはJavaScriptとは逆に配列専用です。
array = filter([1,2,3,4,3,2,1]): |a| a > 2 console.log(array) sum = reduce([1,2,3,4,5,6,7,8,9,10], 0): |s, number| s + number console.log(sum)
配列の中の条件に合った要素を取り出すfilterや、Rubyではinjectとして有名なreduceが使えます。
ダウンロードなど
tana/mican · GitHub
GitHubで公開しています。
GitHubからzipファイルをダウンロードして展開、そして出てきたディレクトリにcdしてから
npm install . -g
でインストールできます。
これから安定して動作するようになればnpmで公開したいと思っています。