tana_ash's diary

プログラミングや電子工作など。やってみたこと、わかったことをまとめておく場所。

JavaScriptに変換される新しい言語「Mican」を作りました!

この記事は altjs Advent Calendar 2012の8日目です。
今回は私が以前から作っていた、JavaScriptにコンパイルされるaltjsとなる新しい言語について紹介します。

言語の紹介

この言語は簡単に言うと、RubyPythonのいいところを取り入れた、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で公開したいと思っています。