2

私はSchemeでの呼び出しの継続に完全に迷っています。誰かがこの例で私を助けることができますか?

 #lang scheme


(define a-continuation '*dummy-value*)

(define (myfunction what? l)
  (cond ((null? l) 0)
        ((what? (car l)) 
         (+ 1 (call/cc (lambda (f)
                         (set! a-continuation f)
                         (myfunction what? (cdr l))))))
        (else (myfunction what? (cdr l)))))

(myfunction number? '(18 16 2015 2))

(a-continuation 2014)           

最初の結果(3)はわかりますが、2017年の結果はわかりません。

4

3 に答える 3

3

私はこれを取得します

> (myfunction number? '(18 16 2015 2))
4
> (a-continuation 2014)
2018

しかし、この「私の知る限り」の説明はまだ機能するはずです。

(私は、継続がその引数に 1 を追加することを期待していました。私は間違っていたので、これも自分自身に説明しようとしています。)

継続部分を除くとmyfunction、述語がいくつの要素を保持しているかをカウントする関数ですwhat?

REPL/interaction ウィンドウで少し遊んでみると、

> (myfunction number? '(1))
1
> (a-continuation 1)
2
> (a-continuation 2)
3

> (myfunction number? '(1 2 3 4 5 6 7 8 9 10))
10
> (a-continuation 1)
11
> (a-continuation 2)
12
> (a-continuation 3)
13

> (myfunction even? '(1 2 3 4 5 6 7 8 9 10))
5
> (a-continuation 1)
6
> (a-continuation 2)
7
> (a-continuation 3)
8

このパターンから、継続がmyfunction見つかった要素の数をその引数に追加することが推測できます。

これがなぜそうであるかについての私の説明です:

それぞれcall/ccを、キャプチャされた継続を呼び出すことによって後で埋めることができる「穴」と見なす場合、最初のものは

(+ 1 <hole>)

二番目

(+ 1 (+ 1 <hole>))

など、述語が成立するたびに 1 つずつ追加の「チェーン」を作成します。
(つまり、最も内側の呼び出しだけでなく、継続が継続するのを「待っている」再帰全体をキャプチャします。)

そう

(myfunction number? '(18 16 2015 2))

のように見えるものを作成します

(+ 1 (+ 1 (+ 1 (+ 1 <hole>))))

継続を呼び出すと、

(a-continuation 2014)

あなたが評価する

(+ 1 (+ 1 (+ 1 (+ 1 2014))))

もちろん2018年です。

(免責事項:これは完全に間違っている可能性があります。 )

于 2015-01-28T13:40:30.543 に答える
0

これは本当に混乱する可能性があります。しかし、もっと簡単な例が役立つかもしれません (ここから取得:

(define return #f) 

(+ 1 (call/cc 
       (lambda (cont) 
         (set! return cont) 
         1))) ;; <--- (+ 1 1)
 > 2
 (return 22)
 > 23

を評価すると(+ 1 (call/cc ...))が得られ2ます。(call/cc ...)その部分の戻り値は1. これで に設定さreturncontましたcall/cc。このスコープでcontは、引数を 1 つ取る手続きです。そして呼び出されると、その引数に評価されます。ここが興味深い部分です。手順を評価すると、 の場所で評価が再開されcall/ccます。したがって、呼び出す(return 22)と、 が評価さ22(+ 1 (call/cc ...))、結果は になり23ます。

これが明確であることを願っています。私がリンクしたページには、他のより複雑な例があります。

于 2015-01-28T15:27:39.607 に答える