お疲れ様です。
valvallowです。
>関数合成や部分適用
ありますね。
確認したら部分適用はsrfi-26(srfi:公式のライブラリ的なもの)にcut, cuteがありますが
composeやcomplementのような関数合成手続きはsrfiでは提供されていないようでした。
gaucheなどでは両方とも提供されています。
個人的には部分適用も関数合成も結構使う機会が多いです。
特に部分適用は使用頻度が高いです。
これはschemeがlisp-1(関数と変数の名前空間が同じ)であることも影響しているかなぁ
と思います。
schemeを書く場合、名前の消費に敏感になるところがあったりするせいか
無名関数やローカル関数をバリバリ使います。
その際、(lambda (a b c) body ...)で書くとlambdaだらけで煩わしく、見通しも悪くなります。
そういう時、cutなんかの部分適用は重宝しています。
例えばですが、fizzbuzzで言うとこんなコードで
(use srfi-1)
(fold-right (lambda (e acc)
(cons (cond ((zero? (modulo e 15)) "fizzbuzz")
((zero? (modulo e 5)) "buzz")
((zero? (modulo e 3)) "fizz")
(else e)) acc))
'() (iota 100 1))
(zero? (modulo e ... がうざいのでcut(部分適用)とcompose(compose)を使って
(fold-right (lambda (e acc)
(let ((p (compose zero? (cut modulo e <>))))
(cons (cond ((p 15) "fizzbuzz")
((p 5) "buzz")
((p 3) "fizz")
(else e)) acc)))
'() (iota 100 1))
cutは
(cut list 1 2 <> <> <> 6 7) <=> (lambda (san yon go)(list 1 2 san yon go 6 7))
というようなものです。
テンプレートの穴埋めみたいで、わかりやすいと思います。
遅延評価の方は私もあまりピンと来ません。
便利なことがあるのは確かですが、あまり気づくことがありません。。
その点では、常に遅延評価なHaskellや、やたら遅延ストリームばっかり使うClojure
なんかをやり込むと新しいパラダイムを得ることができるのかもしれないなぁと思っています。
関数型とオブジェクト指向については、C#のλ式やLINQだったり、
関数型なSchemeにCLOSライクなオブジェクトシステムを組み込んであるGauche
なんかを見ると相性が良いんじゃないかと思っています。
エクストリームググリング!!(笑)
いいですね、それ!
事前にメーリングリストでトピックを上げとくとうまくいきそうですね!