nekoie-call/ccパズル解

[トップ][一覧][最近の更新]

自分の考えた、WiLiKi:Scheme:call/ccパズルの解説。

(以下はネタバレなので、自力でパズルを解きたい人は読まない方がいいです)


 (let* ((yin ((lambda (foo) (newline) foo)
              (call/cc (lambda (bar) bar))))
        (yang ((lambda (foo) (write-char #\*) foo)
               (call/cc (lambda (bar) bar)))))
   (yin yang))


で、Gauche?ではどうしてそうならないのか、を考えると、

のが、一番に思いつく。

結論から書くと、

のだと思う。

例えば、yang0の継続を辿って戻ってきた際に、この時点ではyinにはyin0が入っていれば、guile?と同じ挙動をすると思うが、上記の結果より、Gauche?では、この時点ではyinにはyin1(=yang0)が入っているようだ。

要するに、defineで変数だけ先に用意しておいて、ソレをset!しているのと同等の状態になっているのではと思う。

(ココで、実際に試しに修正して、結果が変わるのを確認して、パッチを送れれば、カッコ良いのだが…‥)

更に考えた結果→nekoie-call/ccパズル解:Gauche/src/compile.cを追ってみるテスト

ところで、この「call/ccを使って、letの変数定義部分の中に戻った際の挙動」って、R5RS?とかで規定されてたっけ?規定されていないなら、どっちが正解とかは言えない気も…‥。


最終更新 : 2004/04/10 20:04:14 JST