(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))))))
は(最後の二つは、ここで定義されていない)、明らかモデルへの手順ですコルーチンツリーに渡して、waddle
に渡すと、葉のみが得られます。 waddle
の直前に2番目の最後の再入力が行われる直前に、'()
の代わりに'()
、の実際の値の代わりに再入力ポイントを設定します。waddle
まるで純粋な関数であるかのように、'()
です。これを考慮して味付けスキーマーのget-まず、取得 - 次、およびよたよた機能
、我々はget-first
が設定されますかを見ることができます...場合はwaddle
リターン「本物のために」、それはget-first
にcall/cc
の内側にあることと、その後(leave (quote()))
ますget-first
の値である(そして、順番に、このleave
は、最後の反復でget-next
に戻ることを意図しているため、の「実際の」戻り値を持つget-next
です。
なぜ、第2のバージョンが等価でないのですか。waddle
の値が'()
の場合、leave
の引数になりますか? 「leave
は、」私はそれになりたい機能ではありませんが、関数は、それは「waddle
」の前にように左から右としていると思われ、それが評価されていますときに評価されるため
私はそれが評価されたときに評価される関数であり、左から右のように見える関数であるため、「残し」は機能しません"これは、それが以前のステートメントで設定されたものに評価されることを意味します。 モラル:関数呼び出し時に関数呼び出しを再定義する必要がある関数を使用する場合は注意してください。これが右から左へのインタプリタ上にあった場合、wardleは、シンボルleaveが参照される前に評価され、どこに残っている関数として参照され、その間はDIFFERENT関数に設定されます。何が混乱していますか... – user1457584
嬉しいことですが解決しましたが、解答として解答を投稿してください(コメントではなく)。そうすれば、人々はここに来ることなく問題を解決することができます。 – Bridge
@ user1457584両方のバージョンはコンパイルされません: 'set !:モジュールのバインドされていない識別子in:leave' – alfasin