読者です 読者をやめる 読者になる 読者になる

以下斜め読んだ内容

pseudo translation of useful posts, book reviews, remarks,etc. twitter: feeddict

Rasmus Andersson「jsランタイムで動く言語Moveつくった」

斜め読み

Rasmus Andersson 2010.3.2のエントリ

Move ― a programming language ― Rasmus Andersson

以下斜め読んだ内容
  • 言語つくってみた
  • ポイント
    • プログラミングに不案内な人が最初に使える言語の候補になるものにしたい
    • かんたんに動かせるように。環境作りにあれこれ大変な思いしないように
    • 休日潰して作った。ドキュメントもテストもつけた
//コードサンプル
hello = ^(name){ "Hello "+name }
repeat {times: 3} ^{
  print hello {name: "John"}
}
  • 動作が安定してきたので仕様変更は今後しない
    • バグ取りやランタイムライブラリの拡張は例外
    • jsが自分のメインで使う言語
  • Moveをしばらく使ってみたらいい感じ
    • ボイラープレートも削れた
    • 生産性もアップ
    • 読みやすい
  • Moveのソースは最適化されたjsへコンパイル
    • ES3以上の環境であればブラウザだろうとサーバサイドだろうと動く
    • ES5未満のJsランタイムでもES5の機能使えるようにしてる
  • 公式ページ
  • githubページ

moveとjsが違うとこをざっくりと

  • 「function(arg){...}」の代わりに「^(arg){...}」と書く「function」=「^」
    • 「^(){...}」は省略して「^{...}」ともかける
  • 排他的なor(xor)のために「xor」演算子使う
  • 関数の定義は式しか使えない
    • スタックとレースとデバッグ機能をリッチにするために制限した
  • 関数スコープ内部の最後の文が返される
  • 関数コールは「foo {key: value}」という構文使う
    • 可読性アップ
    • 沢山ある引数のうち1つだけ引数渡したいときに可読性アップ
      • jsだと「foo(null, null, null, null, true)」と書かないと駄目だけどこれがなくなる
  • 「foo value,....」というワンライナーで引数渡しながらコールもできる
    • jsよりもキーワードの数を減らす
    • print、repeat、create、とかを実装した
    • DSLとかも作りやすく
  • 引数に初期値も設定できる
    • 「foo = ^(bar, baz: 4, names=[], age) {....}」
  • 変数は宣言しなくても宣言扱い(varいらず)
    • var使うと文法エラーに
  • 式の終わりでカンマ(,)不要
  • 「==」は、「===」扱い
    • 「!=」も同じ
  • jsの「this」はMoveでは「@hogehoge」とかく
    • 「this.foo」は「@foo」になる
  • モジュールの読み込み
    • import文
    • 冗長に「var module1=require("module1")」と書かない
    • シンプルに「import module1」
  • モジュールのexport
    • export文でできる
    • 「o = exports.foo = function () {... 」と書かずにOK
    • シンプルに「export foo = ^{...」とか「export foo」
  • 非ES5なjsランタイム上でもES5の機能も使えるように
    • Array.isArray、Object.create、String.prototype.trim使える
  • 人間が読みやすくなるようにデザインした
  • Move/jsと他の言語との違いの1つ
    • 関数の生成・ハンドリング・呼び出しが独特
    • Move/jsでは関数は1stクラスオブジェクト
  • Moveでは関数の「(..)」や「{...}」を削除できる
//repeatの定義
repeat =^(times){^(block){if(times !=undefined)for(i=0; i<times;++i)if(block(i)==true)breakelsewhile(true)if(!block())break}}
//repeatをコール
repeat {times:3}^{print"Hello"}
  • 「repeat {times:3}^{print"Hello"}」はコンパイルされると「repeat({times:3})(function(){print("Hello");});」というjsコードになる
  • ビルトイン関数
    • create
      • 他のオブジェクトからオブジェクト生成
    • extend
    • print
    • repeat
    • after
  • Moveを使うには
    • movelang.orgへアクセス
    • replあり
    • textmate用のbundleあり
      • シンタックスハイライト
      • コンパイル済jsコード表示
      • AST表示
      • etc.
  • node/npm使ってMoveをインストール
    • 「npm install move」
  • 実行は「move my-move-program.mv」
  • nodeアプリでmoveモジュールを使う
    • 「require('move')」