5
(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-firstget-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

4

1 に答える 1

4

混乱しているのは、" leave" が私が望んでいる関数ではなく、評価されたときに評価される関数であり、左から右に、したがって " waddle" の前に表示されるためです。つまり、前のステートメントで設定されたものに評価されます。

道徳: 関数の呼び出し内で再定義される可能性のある関数を使用する場合は注意してください! これが右から左へのインタープリター上にある場合はwaddle、シンボルleaveがどこにでも「出発」する関数として検索される前に評価され、その間に DIFFERENT 関数に設定されます。

于 2012-06-19T03:42:58.740 に答える