Gauche > Archives > 2013/04/26

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