#(define (call-with-values* f . funcs)
((apply .$ (reverse! (cons f funcs)))))
#何となくパイプライン的に、処理が前から後ろに行って欲しい時があるので。
#効率は無視してます。.$ の効率よくわからないので。fold + call-with-values でも、毎回サンクを作らなきゃならないのであんまり嬉しくない。
#もっとイケてる方法ってありますかね?
#イケてるかどうかは分かりませんが,こんなマクロなら書いたことがあります
#(define-syntax $>
(syntax-rules (=>)
((_ value)
value)
((_ value => proc expr ...)
($> (receive xs value
(apply proc xs)) expr ...))
((_ value (proc args ...) expr ...)
(receive vars value
($> (apply (cut proc args ... <...>) vars) expr ...)))
((_ value proc expr ...)
($> (receive xs value
(apply proc xs)) expr ...))))
#gosh> ($> 3 (* 10) (- <> 1) => (^x (+ x x)))
58
#いい名前募集中です( ,,Ծ_Ծ,,)
#なるほど
#面白いですね。視認性よさそう
#->,->>マクロ - yamasushiの日記
http://yamasushi.hatenablog.com/entry/20100523/1274610393
#applyではなく、formを書き換えるアプローチだったと記憶しています。(随分むかしに移植したものなのですけど)
#Gaucheでそのまま使えるのかどうかは、ちょっとわからないです。(汗
#多値に対応しようとすると(値の数が事前に分からなければ)receiveしてapplyするしかないと思いました.
#あ、そうか。多値でしたか。なるほど。
#あれ、formの書き換えだから、receive構文さえも書き換えの対象となりうることになるから、対応できないことはないような気もしてきた。
#やっぱり、勘違いだったみたいです。お騒がせしました。
#多分、(-> '(1) ($ values->list $ apply func1) ($ values->list $ apply func2) みたいな感じかなとか・・・
#$>の実装と実質変わらないのですが、こちらはvalues->listを使うわけです。->マクロがそれをフォームの最後に割り込ませていくのです。
#一つのアイデアとしては,全てcut方式の<>で引数を明示すればapplyは消せそうです.でもそれは面倒なので,さっきの $> マクロは利便性重視です.
#あ、$は多値に使えないのだった。
#なるほど。マクロはおろか、cutの使い方を満足に知らないので勉強になります。
#gosh> ($ values->list $ quotient&remainder 13 23)
(0 13)
#やっぱり、つかえるのか。
#gosh> ($ values->list $ apply quotient&remainder '(13 23))
(0 13)
#の'(12 23)の部分を -> マクロが挿入していくはずだから、多分、->があれば動くと・・・・・・思う。
#パイプラインをプログラムで構築して喰わせる、という用途だと、マクロはちょっと厳しいですね。
#だったらreverseしてcomposeに喰わせれば済む話ではありますが。
#そして最初に戻る...