03 月 06 日(Sat)のアレゲメモ
なんでも継続、ActionScript で。
「なんでも継続、Perl で。」 、「なんでも継続、C++ で。」 に続いて、 こんどは Flash MX の ActionScript で書いてみました。
元ネタは川合史朗さんの 「なんでも継続」 を参照してください。
Scheme の元のコード
(define (leaf-count/cps tree cont) (if (pair? tree) (leaf-count/cps (car tree) (lambda (n) (leaf-count/cps (cdr tree) (lambda (m) (cont (+ n m)))))) (cont 1))) (define tree '((a . b) (c . d) . e)) (leaf-count/cps tree values)
ActionScript で書いた場合
Flash MX を立ち上げて、下記のコードを第 1 フレームのアクションに書いて実行すると、 「出力」ウィンドウに「5」と表示されるはずです。
function leaf_cout_cps (tree, cont) { if (typeof (tree) == "object") { return leaf_cout_cps (tree [0], function (n) {return leaf_cout_cps (tree [1], function (m) {return cont (n + m);})}); } else { return cont (1); } } function values (x) {return x;} var tree = [[["a", "b"], ["c", "d"]], "e"]; trace (leaf_cout_cps (tree, values));
もとの Scheme のコードとほとんど同じ長さに書けてしまいました。 コードの書き換えもかなり「直截的」です。
強いていえば、 関数から値を戻すのにいちいち return を書かなきゃいけないのが煩わしいですが。
ActionScript は、一応オブジェクト指向プログラミング言語なんですが、 Flash の新しいバージョンがリリースされるたびに大幅に仕様が変更されるので、 いまいち安心して使うことができません。
でも、 上のコードのように、 クラスを使わずに function でいろんなものを抽象することは出来そうなので、 意外といろんなことに使えるかも。