レガシーコード生産ガイド

私に教えられることなら

Factorでレキシカル変数使用・未使用の比較

レキシカル変数使用でどれぐらいわかりやすく書けるか、フィボナッチ数列で試してみる。

5 fibの結果[ 5 3 2 1 1 ]が積まれるという仕様にする。

まずはスタック操作のみ。レキシカル変数以外のFactorの便利仕様は使っていいものとする。

: (fib-no-var) ( quot n -- quot n )
    dup 0 = [
        swap dup dup rest first swap first + [ ] curry prepend
        swap 1 - (fib-forth)
    ] unless ;

: fib-no-var ( n -- quot )
    {
        { [ dup 1 = ] [ drop [ 1 ] ] }
        [ 2 - [ 1 1 ] swap (fib-no-var) drop ]
    } cond ;

(fib-no-var)のswap dup dup rest first swap first + [ ] curry prependが相当にヤバいオーラだしてる1週間後どころかさっき書いたコードなのにすでに読める気がしない。

次はレキシカル変数使用版

:: (fib-with-var) ( fibs i -- fibs i-1 )
    {
        { [ i 0 = ] [ fibs i ] }
        [
            [let
                fibs first :> n fibs rest first :> n-1
                fibs n n-1 + [ ] curry prepend
                i 1 - (fib-with-var) ]
        ]
    } cond ;

:: fib-with-var ( n -- quot )
    {
        { [ n 1 = ] [ [ 1 ] ] }
        [ [ 1 1 ] n 2 - (fib-with-var) drop ]
    } cond ;

これならまあ読めるかな、というカンジ。もっとうまい書き方はありそう。

Lispと比べて

Factorは相当Lispに影響を受けているみたいで、少しFactorとLispを勉強した今、これは「別の形のLisp」なのかなと感じる。受け入れ可能とかじゃなくて、コードとデータが同じ形とか、そういったものも全て含めて「もしかしたらこうだったかもしれない」並行世界のLispみたいな。

言語だけで比べると、やっぱりLispの方が読みやすいから好きなんだけど、環境まで含めるとFactorのListener/BrowserとConcatenativeな言語が相乗効果を発揮してものすごく触りやすい。emacs+SLIMEでデバッガ特にCommon Lispでこういう環境は無いんだろうか。ありそうだよなあ。探すかなあ。作るかなあ。作ったら楽しそうだなあ。というところ。

広告を非表示にする