(define get-first
(lambda (l)
(call-with-current-continuation
(lambda (here)
(set! leave here)
(waddle l)
(leave (quote ()))))))
(define get-first
(lambda (l)
(call-with-current-continuation
(lambda (here)
(set! leave here)
(leave (waddle l))))))
「The Seasoned Schemer」という本に精通していない人にとっては、get-first、get-next、および(最後の 2 つはここでは定義されていません) は、葉のみを生成するために渡されたツリーを反復処理するコルーチンwaddleを明らかにモデル化するための手順です。最後から 2 番目の再エントリでの yield の直前に、純粋な値のみを返す場所に再エントリ ポイントを設定します。つまり、yield の代わりにisの実際の値をずっと純粋な機能。 waddlewaddle'()'()waddle '()
get-firstこれを念頭に置いて、何が設定されているかを見ることができます... waddle"実際に" を返すとき、それはincall/ccの中にあり、その値は(そして、これは最後の繰り返しでに戻ることを意図しています。したがって、の「実際の」リターンを行うのは) です。 get-first(leave (quote ()))get-firstleaveget-nextget-next'()
では、なぜ 2 番目のバージョンは同等ではないのですか?waddleの値は'()の引数になります。leave