1年くらいSchemeやってて継続(渡し、呼び出し)についても何度か読んだり書いたりしてるはずなのに未だに「どんなんだっけ?」となってしまう私です。
「なんでも継続」とか読んで少しだけ書いてみた。
普通の階乗
;; factorial |
継続渡し階乗(Continuation Passing Style -> CPS)
(define fact/cps |
やっぱりイメージが沸かないので展開してみた
(fact/cps 5 (lambda (x) x))
(fact/cps (- (- (- 5 1) 1) 1) (fact/cps (- (- (- (- 5 1) 1) 1) 1) (fact/cps (- (- (- (- (- 5 1) 1) 1) 1) 1) |
ということですか。わかりました。わかりません。毎度理解できたつもりですが、数日すると忘れるんだろうな。ということはつまりわかってないのな。
実行時のキャプチャーとか言いますよね、わかります。わかりません。セーブポイントみたいなもんだということですね?現在の環境ごとクロージャにぶち込んでほいほい渡していって必要になってから使うし使わなくても良いし、と。
超てきとうとは書いてありますがわかりややすかったです。「なんでも継続」の最初の方もわかりやすかった。
The Little Schemer のrember&coのところをもっかいやってみよう。というか丸ごと読み直そう。んでThe Seasoned Schemerもちゃんと読もう。
なんかピンとこないんですよね・・・。
あ、ついでにJavaScriptとC#も。改めて書く必要もなく同じコードなんですけどね。なんとなく。C#は気分でgoto使ってみた。
JS
function factCps (n, cont) factCps(5, function(x){ return x;}); |
C#
using System; using System.Diagnostics; namespace SampleCallPassingStyle restart: try public static decimal FactCps(decimal n, decimal nest, Func<decimal, decimal> cps) //return n == 0 |
posted with amazlet at 09.03.30 Daniel P. Friedman Matthias Felleisen おすすめ度の平均: 小さなScheme処理系で学ぶ数学基礎理論 |
posted with amazlet at 09.03.30 Daniel P. Friedman Matthias Felleisen おすすめ度の平均: Little Schemer とセットで |
0 件のコメント:
コメントを投稿