PasteRack.org
Paste # 77156
2014-11-05 08:08:28

Forked from paste # 37256.

Fork as a new paste.

Paste viewed 402 times.


Embed:

kont-wrappeed

  1. #lang racket
  2.  
  3. (define (test-kont)
  4.  
  5.   ;;Global variable for the continuation
  6.   (define k-global #f)
  7.  
  8.   ;;We are using let* instead of let so that we can guarantee
  9.   ;;the evaluation order
  10.   (let* ((my-number 3)
  11.          (k
  12.           ;;set bookmark here
  13.           (call-with-current-continuation
  14.            ;;The continuation will be stored in "kont"
  15.            (lambda (kont)
  16.              ;;return the continuation
  17.              kont))))
  18.  
  19.     ;;We are using "my-number" to show that the old stack
  20.     ;;frame is being saved. When we revisit the continuation
  21.     ;;the second time, the value will remain changed.
  22.     (display "The value of my-number is: ")
  23.     (display my-number)
  24.     (newline)
  25.     (set! my-number (+ my-number 1))
  26.  
  27.     ;;Save the continuation in a global variable.
  28.     (set! k-global k)
  29.     (display "test #2")
  30.     (newline))
  31.  
  32.   (display "test#")
  33.   (newline)
  34.  
  35.   ;;Is "kontinuation" a continuation?
  36.   (if (procedure? k-global)
  37.       (begin
  38.        (display "This is the first run, k-global is a continuation")
  39.        (newline)
  40.        ;;Send "4" to the continuation which goes to the bookmark
  41.        ;;which will assign it to "k"
  42.        (k-global 4))
  43.     (begin
  44.      ;;This occurs on the second run
  45.      (display "This is the second run, k-global is not a continuation, it is ")
  46.      (display k-global)
  47.      (newline))))
  48.  
  49. (test-kont)

=>

The value of my-number is: 3

test #2

test#

This is the first run, k-global is a continuation

The value of my-number is: 4

test #2

test#

This is the second run, k-global is not a continuation, it is 4