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 でいろんなものを抽象することは出来そうなので、 意外といろんなことに使えるかも。