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
結論
まとめますと、
- of メソッドの使い方は、引数にオブジェクトを入れて、指定したcall メソッドで呼び出す
- 再代入の排除ができる
- プロパティに入れておけば、base 関数で呼び出されたオブジェクトを
遅延評価する (に含まれる関数を呼び出す(ついでに、結果の値をキャッシュもする)
というような特徴があります。この特徴は、次回のリリースで反映されます。
今後の予定
これらのメソッドを使って、SMILアニメーションの実装に取り掛かりますが、その前に、プロパティの再代入禁止など、いくつかの技術を検討します。これは、今度の記事で整理します。
追記 (1月9日)
遅延評価ではなくて、先行評価でした。申し訳ないです。もうすこし、調査が必要かと思われます。