(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の実際の値をずっと純粋な機能。 waddle
waddle
'()
'()
waddle
'()
get-first
これを念頭に置いて、何が設定されているかを見ることができます... waddle
"実際に" を返すとき、それはincall/cc
の中にあり、その値は(そして、これは最後の繰り返しでに戻ることを意図しています。したがって、の「実際の」リターンを行うのは) です。 get-first
(leave (quote ()))
get-first
leave
get-next
get-next
'()
では、なぜ 2 番目のバージョンは同等ではないのですか?waddle
の値は'()
の引数になります。leave