技術memo

関数型ゴースト

Scheme(Gauche)でポイントフリースタイル風味

;; リスト(ツリー)を平坦化する。
(define flatten
  (letrec ((flatten-rev
            (fold$
             (lambda (x acc)
               (if (list? x)
                   ;; xがlistなら再帰呼び出し結果をaccの先頭に追加
                   ((compose (fold$ cons acc) reverse flatten-rev) x)
                   ;; それ以外なら単にxをaccの先頭に追加
                   (cons x acc)))
             '())))
    (compose reverse flatten-rev))); 最終的に正しい順(逆順)にする
;; test
(equal?
 (flatten '((1 2 3) 4 5 (6 (7 8))))
 '(1 2 3 4 5 6 7 8))
;; #t
続きを読む

継続渡しスタイルの再帰関数の読み解き方、あるいは多値で済む場合

Scheme手習い(The Little Schemer) 8章に、multirember&coという関数が出てくるのですが、何だか急に難しさが跳ね上がったようで、正直わけがわからなかったので、自分用に解説をメモしておきます。 動作環境はGauche 0.9.4です。

続きを読む