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
- 動作環境はGauche 0.9.4です。
compose
は関数合成です- 関数の部分適用では、
cut
マクロが便利そうです。- Gauche ユーザリファレンス: 4.3 手続きを作る
- 関数が入れ子になった先の
<>
までは対象にならない*3ので、そういう場合は素直にlambdaで書きます。
- また、
pa$
関数は、関数の部分適用ができます。- Gauche ユーザリファレンス: 6.18 手続きと継続 参照。
- curry化ではないので、
((pa$ cons 1) '(2))
はできても、(=>(1 2)
)(((pa$ cons) 1) '(2))
はできません。
- 使い方説明にもありますが、引数は最初の引数から適用されます。
((pa$ string-append "a" "b") "c" "d")
=>"abcd"
- 先日の記事でも
map$
,filter$
,for-each$
等のリスト処理関数を使っていますが、大体このあたりを把握しておけば、まずまず関数型スタイルなプログラミングができそうです。- 「やりすぎ危険」な症状が既に出ている感じもありますが。