base.jsにofメソッドとcallメソッドを追加してみた

ラムダ計算とbase.js

ラムダ計算が、SMILアニメーションに使えるので、base.js にof メソッドとcall メソッドを実装してみました。変数の再代入禁止や遅延評価ができるようになるでしょう。
この記事では、その簡単なコーディングを解説します。

base.jsについて

まず、base.jsはプロトタイプベースのオブジェクト指向ライブラリです。次のように、ワンライナーで、オブジェクトの生成と継承がさくっと同時にできます。

base("$hoge").up("$hoge")

of メソッドとcall メソッドの使い方

さて、今回は、ofメソッドを使って、新たなメソッドを作ってみます。
ofメソッドの引数に、オブジェクトを入れます。そのメソッドの名前は「call」に固定しておきます。このcallメソッドは後で使います。

base("$plus").of( {
  x: 12,
  y: 15,
  call: function() {
    return this.x + this.y;
  }
} );

この$plusオブジェクトをcallメソッドで呼び出すと、次のように、「27」という数値が返ります。

base("$plus").call(); // 27

これで、足し算が簡単にできました。さらに、この和の結果、27 を、掛け算(以降、積)として、10にかけたいと思います。

base("$multiply").of( {
  x: base("$plus"),
  y: 10,
  call: function() {
   return this.x * this.y;
  }
} );

base("$multiply").call(); // 270

27 * 10 = 270という数値が返ったことが確かめられました。
上のx プロパティで、$plus オブジェクトが指定されていることに注意してください。
もちろん、$plus オブジェクトと$multiply オブジェクトのどちらかを、先に宣言してもかまいません。たとえば、以下のコードを見ていただければわかりますが、ひっくり返してもOKです。

/*先に積を宣言*/
base("$multiply").of( {
  x: base("$plus"),
  /*...*/
} );

base("$plus").of( { /*...*/ });

base("$multiply").call(); // 270

このコーディングの最大の利点が、一度も= (イコール)などの代入を使っていないことに注目してください。この結果、変数の再代入を排除することができるのです。
ただし、注意事項として、of メソッドを使った再代入はできません。

base("$plus").of( {} );
base("$plus").of( {} ); //再代入はエラー

この場合、up メソッドを使って、オブジェクトの継承をしておきます。

base("$plus").up("$subObject").of( {} ); //継承したオブジェクトの再代入はOK

結論

まとめますと、

  1. of メソッドの使い方は、引数にオブジェクトを入れて、指定したcall メソッドで呼び出す
  2. 再代入の排除ができる
  3. プロパティに入れておけば、base 関数で呼び出されたオブジェクトを遅延評価する (に含まれる関数を呼び出す(ついでに、結果の値をキャッシュもする)

というような特徴があります。この特徴は、次回のリリースで反映されます。

今後の予定

これらのメソッドを使って、SMILアニメーションの実装に取り掛かりますが、その前に、プロパティの再代入禁止など、いくつかの技術を検討します。これは、今度の記事で整理します。

追記 (1月9日)

遅延評価ではなくて、先行評価でした。申し訳ないです。もうすこし、調査が必要かと思われます。