簡體   English   中英

Scheme中的延續返回是什么?

[英]What does a continuation return in Scheme?

我遇到了一些我無法理解的東西。

#lang scheme

(define cc #f)

(define (val!)
  (call/cc
   (lambda (k)
     (set! cc k)
     0)))

(* 10 (val!))

(cc 100)

到現在為止還挺好; (* 10 [])的延續存儲在cc ,如果我們調用(cc 100)我們會按預期在REPL中看到1000

但我接下來嘗試的是將變量定義為運行延續的結果:

(define x (cc 20))

我在REPL中看到200是結果,但x沒有定義。

存儲在cc的continuation是否包含它的返回值,以便define的調用永遠不會返回,而評估是(* 10 val) 到底是怎么回事?

這是怎么回事?

有兩種類型的延續。

call/cc產生的延續從不向其調用者返回值。 請參閱Will Ness的答案

但是,通過call-with-composable-continuation continuation產生call-with-composable-continuation可組合的延續,它確實返回值。

解決方案

如果要繼續向其調用者返回值,則應使用可組合的延續,通過設置提示並使用call-with-composable-continuation

您可以定義一種提示:

(define my-prompt
  (make-continuation-prompt-tag 'my-prompt))

並使用call-with-composable-continuation的提示指定您只想從提示符開始捕獲延續。

(define cc #f)

(define (val!)
  (call-with-composable-continuation
   (lambda (k)
     (set! cc k)
     0)
   my-prompt))

然后你只需要在你打電話給val!之前把提示放在你希望繼續的地方val! 保存它。

;; the prompt specifies that it's `(* 10 [])`, and not something larger
(call-with-continuation-prompt
 (λ () (* 10 (val!)))
 my-prompt)

然后,由於此延續具有由提示定義的明確“結束”,因此它可以在到達該結束時返回值。

(define x (cc 20))
; defines x as 200

另請參閱: “持續提示”究​​竟是什么?

它什么都不返回,因為它沒有返回。 (cc 20)正如(cc 100) 將值返回給調用者。 cc不是一個函數,它是一個延續 - 它記住它自己返回/ “提供”其值的位置。

(define x (cc 20))

大概是指偽代碼,

(let ([val (cc 20)])
  (primitive-define-top-level-var! "x" val))

但是(cc 20)繞過val的設置並使用它來定義x ,並直接返回到頂層,就像原始捕獲的延續一樣。

存儲在cc的continuation是否包含其返回的[ “destination” - wn],以便define的調用永遠不會返回,而評估是(* 10 val)

是。

到底是怎么回事?

確切地說。


編輯:

在DrRacket中加載以下內容,

#lang scheme

(define cc #f)
(define (val!)
  (call/cc
   (lambda (k)
     (set! cc k)
     0)))
(* 10 (val!))
(cc 100)
(display "Good!\n")
(define x (cc 20))
(display "Shucks!\n")

我甚至收到一條錯誤消息,解釋發生了什么:

語言:方案,調試; 內存限制:128 MB。
0
1000
好!
200

>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM