Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
Continuation
(section)
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
===Examples=== The [[Scheme (programming language)|Scheme]] programming language includes the control operator [[call-with-current-continuation]] (abbreviated as: call/cc) with which a Scheme program can manipulate the flow of control: <syntaxhighlight lang="scheme"> (define the-continuation #f) (define (test) (let ((i 0)) ; call/cc calls its first function argument, passing ; a continuation variable representing this point in ; the program as the argument to that function. ; ; In this case, the function argument assigns that ; continuation to the variable the-continuation. ; (call/cc (lambda (k) (set! the-continuation k))) ; ; The next time the-continuation is called, we start here. (set! i (+ i 1)) i)) </syntaxhighlight> Using the above, the following code block defines a function <code>test</code> that sets <code>the-continuation</code> to the future execution state of itself: <syntaxhighlight lang="scheme"> > (test) 1 > (the-continuation) 2 > (the-continuation) 3 > ; stores the current continuation (which will print 4 next) away > (define another-continuation the-continuation) > (test) ; resets the-continuation 1 > (the-continuation) 2 > (another-continuation) ; uses the previously stored continuation 4 </syntaxhighlight> For a gentler introduction to this mechanism, see [[call-with-current-continuation]]. ====Coroutines==== This example shows a possible usage of continuations to implement [[coroutines]] as separate threads.<ref>Haynes, C. T., Friedman, D. P., and Wand, M. 1984. Continuations and coroutines. In Proceedings of the 1984 ACM Symposium on LISP and Functional Programming (Austin, Texas, United States, August 06β08, 1984). LFP '84. ACM, New York, NY, 293-298.</ref> <syntaxhighlight lang="scheme"> ;;; A naive queue for thread scheduling. ;;; It holds a list of continuations "waiting to run". (define *queue* '()) (define (empty-queue?) (null? *queue*)) (define (enqueue x) (set! *queue* (append *queue* (list x)))) (define (dequeue) (let ((x (car *queue*))) (set! *queue* (cdr *queue*)) x)) ;;; This starts a new thread running (proc). (define (fork proc) (call/cc (lambda (k) (enqueue k) (proc)))) ;;; This yields the processor to another thread, if there is one. (define (yield) (call/cc (lambda (k) (enqueue k) ((dequeue))))) ;;; This terminates the current thread, or the entire program ;;; if there are no other threads left. (define (thread-exit) (if (empty-queue?) (exit) ((dequeue)))) </syntaxhighlight> The functions defined above allow for defining and executing threads through [[Computer multitasking#Cooperative multitasking|cooperative multitasking]], i.e. threads that yield control to the next one in a queue: <syntaxhighlight lang="scheme"> ;;; The body of some typical Scheme thread that does stuff: (define (do-stuff-n-print str) (lambda () (let loop ((n 0)) (format #t "~A ~A\n" str n) (yield) (loop (+ n 1))))) ;;; Create two threads, and start them running. (fork (do-stuff-n-print "This is AAA")) (fork (do-stuff-n-print "Hello from BBB")) (thread-exit) </syntaxhighlight> The previous code will produce this output: This is AAA 0 Hello from BBB 0 This is AAA 1 Hello from BBB 1 This is AAA 2 Hello from BBB 2 ...
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)