2012-06-15 10 views
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)))))) 

は(最後の二つは、ここで定義されていない)、明らかモデルへの手順ですコルーチンツリーに渡して、waddleに渡すと、葉のみが得られます。 waddleの直前に2番目の最後の再入力が行われる直前に、'()の代わりに'()の実際の値の代わりに再入力ポイントを設定します。waddleまるで純粋な関数であるかのように、'()です。これを考慮して味付けスキーマーのget-まず、取得 - 次、およびよたよた機能

、我々はget-firstが設定されますかを見ることができます...場合はwaddleリターン「本物のために」、それはget-firstcall/ccの内側にあることと、その後(leave (quote()))ますget-firstの値である(そして、順番に、このleaveは、最後の反復でget-nextに戻ることを意図しているため、の「実際の」戻り値を持つget-nextです。

なぜ、第2のバージョンが等価でないのですか。waddleの値が'()の場合、leaveの引数になりますか? 「leaveは、」私はそれになりたい機能ではありませんが、関数は、それは「waddle」の前にように左から右としていると思われ、それが評価されていますときに評価されるため

+0

私はそれが評価されたときに評価される関数であり、左から右のように見える関数であるため、「残し」は機能しません"これは、それが以前のステートメントで設定されたものに評価されることを意味します。 モラル:関数呼び出し時に関数呼び出しを再定義する必要がある関数を使用する場合は注意してください。これが右から左へのインタプリタ上にあった場合、wardleは、シンボルleaveが参照される前に評価され、どこに残っている関数として参照され、その間はDIFFERENT関数に設定されます。何が混乱していますか... – user1457584

+2

嬉しいことですが解決しましたが、解答として解答を投稿してください(コメントではなく)。そうすれば、人々はここに来ることなく問題を解決することができます。 – Bridge

+0

@ user1457584両方のバージョンはコンパイルされません: 'set !:モジュールのバインドされていない識別子in:leave' – alfasin

答えて

3

混乱があります。つまり、これまでのステートメントでは、それが設定された場所に評価されます。

モラル:関数呼び出し時に関数呼び出しを再定義することに注意してください。これが右から左へのインタプリタの場合は、leaveというシンボルが参照される前に、waddleが評価され、どこにでも残っている関数として参照され、その間はDIFFERENT関数に設定されます。

+2

あなたが答えを書いたとしても、あなたの質問に答えてください。さもなければ、それは未回答のリストに現れます。 –

関連する問題