~ chicken-core (chicken-5) 782c15b91bc088bebe1636bced3bd02e87baa0dc
commit 782c15b91bc088bebe1636bced3bd02e87baa0dc Author: Evan Hanson <evhan@foldling.org> AuthorDate: Wed Jan 13 09:05:46 2016 +1300 Commit: Evan Hanson <evhan@foldling.org> CommitDate: Tue Mar 8 22:52:33 2016 +1300 Move continuations API to new chicken.continuation module diff --git a/README b/README index 3a1146bc..7fb57d91 100644 --- a/README +++ b/README @@ -286,6 +286,7 @@ | |-- chicken | | `-- 8 | | |-- chicken.import.so + | | |-- chicken.continuation.import.so | | |-- chicken.data-structures.import.so | | |-- chicken.eval.import.so | | |-- chicken.expand.import.so diff --git a/c-platform.scm b/c-platform.scm index 1419de4b..1bccf350 100644 --- a/c-platform.scm +++ b/c-platform.scm @@ -210,7 +210,8 @@ ##sys#check-char ##sys#check-vector ##sys#check-byte-vector ##sys#list ##sys#cons ##sys#call-with-values ##sys#flonum-in-fixnum-range? ##sys#fudge ##sys#immediate? ##sys#context-switch - ##sys#make-structure ##sys#apply ##sys#apply-values ##sys#continuation-graft + ##sys#make-structure ##sys#apply ##sys#apply-values + chicken.continuation#continuation-graft ##sys#bytevector? ##sys#make-vector ##sys#setter ##sys#car ##sys#cdr ##sys#pair? ##sys#eq? ##sys#list? ##sys#vector? ##sys#eqv? ##sys#get-keyword ##sys#foreign-char-argument ##sys#foreign-fixnum-argument ##sys#foreign-flonum-argument @@ -410,7 +411,7 @@ (rewrite '##sys#call-with-values 13 2 "C_u_call_with_values" #f) (rewrite '##sys#call-with-values 13 2 "C_call_with_values" #t) (rewrite 'chicken.lolevel#locative-ref 13 1 "C_locative_ref" #t) -(rewrite '##sys#continuation-graft 13 2 "C_continuation_graft" #t) +(rewrite 'chicken.continuation#continuation-graft 13 2 "C_continuation_graft" #t) (rewrite 'caar 2 1 "C_u_i_caar" #f) (rewrite 'cdar 2 1 "C_u_i_cdar" #f) diff --git a/chicken-install.scm b/chicken-install.scm index 35302baf..d1924685 100644 --- a/chicken-install.scm +++ b/chicken-install.scm @@ -45,7 +45,8 @@ (define +default-repository-files+ ;;XXX keep this up-to-date! - '("chicken.data-structures.import.so" + '("chicken.continuation.import.so" + "chicken.data-structures.import.so" "chicken.eval.import.so" "chicken.expand.import.so" "chicken.extras.import.so" diff --git a/chicken.import.scm b/chicken.import.scm index 39dad630..b8408c34 100644 --- a/chicken.import.scm +++ b/chicken.import.scm @@ -52,10 +52,6 @@ condition-property-accessor condition? condition->list - continuation-capture - continuation-graft - continuation-return - continuation? copy-read-table cplxnum? cpu-time diff --git a/continuation.scm b/continuation.scm new file mode 100644 index 00000000..78aa2544 --- /dev/null +++ b/continuation.scm @@ -0,0 +1,65 @@ +;;;; continuation.scm - A better API for continuations +; +; Copyright (c) 2008-2016, The CHICKEN Team +; Copyright (c) 2000-2007, Felix L. Winkelmann +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following +; conditions are met: +; +; Redistributions of source code must retain the above copyright notice, this list of conditions and the following +; disclaimer. +; Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +; disclaimer in the documentation and/or other materials provided with the distribution. +; Neither the name of the author nor the names of its contributors may be used to endorse or promote +; products derived from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS +; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +; AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR +; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +; POSSIBILITY OF SUCH DAMAGE. + +(declare + (unit continuation) + (disable-interrupts)) + +(foreign-declare "#define C_direct_continuation(dummy) t1") + +;; XXX Is this still used anywhere? +(define (##sys#call-with-direct-continuation k) + (##core#app k (##core#inline "C_direct_continuation" #f))) + +(module chicken.continuation + (continuation? + continuation-capture + continuation-graft + continuation-return) + +(import scheme chicken) + +(include "common-declarations.scm") + +(define (continuation-capture proc) + (let ((winds ##sys#dynamic-winds) + (k (##core#inline "C_direct_continuation" #f))) + (proc (##sys#make-structure 'continuation k winds)))) + +(define (continuation? x) + (##sys#structure? x 'continuation)) + +(define (continuation-graft k thunk) + (##sys#check-structure k 'continuation 'continuation-graft) + (let ([winds (##sys#slot k 2)]) + (unless (eq? ##sys#dynamic-winds winds) + (##sys#dynamic-unwind winds (fx- (length ##sys#dynamic-winds) (length winds)))) + ((##core#primitive "C_continuation_graft") k thunk))) + +(define continuation-return + (lambda (k . vals) + (##sys#check-structure k 'continuation 'continuation-return) + ((##core#primitive "C_continuation_graft") k (lambda () (apply values vals)))))) diff --git a/defaults.make b/defaults.make index 41a5212d..65ccce10 100644 --- a/defaults.make +++ b/defaults.make @@ -266,7 +266,7 @@ PRIMITIVE_IMPORT_LIBRARIES = chicken csi chicken.foreign POSIX_IMPORT_LIBRARY = chicken.posix DYNAMIC_IMPORT_LIBRARIES = setup-api setup-download srfi-4 DYNAMIC_CHICKEN_IMPORT_LIBRARIES = data-structures eval repl expand \ - extras files internal irregex lolevel ports tcp utils + continuation extras files internal irregex lolevel ports tcp utils # targets diff --git a/distribution/manifest b/distribution/manifest index d3cd94c5..51c4f6ba 100644 --- a/distribution/manifest +++ b/distribution/manifest @@ -19,6 +19,7 @@ chicken.compiler.core.import.scm csc.c csi.c eval.c +continuation.c data-structures.c ports.c files.c @@ -74,6 +75,7 @@ files.scm chicken-bug.1 chicken-bug.scm chicken-bug.c +continuation.scm library.scm lolevel.scm optimizer.scm @@ -242,6 +244,8 @@ chicken-syntax.c common-declarations.scm chicken.import.scm chicken.import.c +chicken.continuation.import.scm +chicken.continuation.import.c chicken.data-structures.import.scm chicken.data-structures.import.c chicken.eval.import.scm @@ -334,6 +338,7 @@ manual-html/Supported language.html manual-html/The R5RS standard.html manual-html/The User's Manual.html manual-html/Types.html +manual-html/Unit continuation.html manual-html/Unit data-structures.html manual-html/Unit eval.html manual-html/Unit expand.html diff --git a/eval.scm b/eval.scm index a9b090ad..7bb00ae8 100644 --- a/eval.scm +++ b/eval.scm @@ -74,6 +74,7 @@ (define-constant core-chicken-modules '((chicken . chicken-syntax) + (chicken.continuation . continuation) (chicken.data-structures . data-structures) (chicken.eval . eval) (chicken.expand . expand) diff --git a/library.scm b/library.scm index 2f35b7af..49688678 100644 --- a/library.scm +++ b/library.scm @@ -62,8 +62,6 @@ #define C_free_mptr(p, i) (C_free((void *)C_block_item(p, C_unfix(i))), C_SCHEME_UNDEFINED) #define C_free_sptr(p, i) (C_free((void *)(((C_char **)C_block_item(p, 0))[ C_unfix(i) ])), C_SCHEME_UNDEFINED) -#define C_direct_continuation(dummy) t1 - #define C_a_get_current_seconds(ptr, c, dummy) C_int64_to_num(ptr, time(NULL)) #define C_peek_c_string_at(ptr, i) ((C_char *)(((C_char **)ptr)[ i ])) @@ -2333,7 +2331,6 @@ EOF (define (procedure? x) (##core#inline "C_i_closurep" x)) (define apply (##core#primitive "C_apply")) (define ##sys#call-with-current-continuation (##core#primitive "C_call_cc")) -(define (##sys#call-with-direct-continuation k) (##core#app k (##core#inline "C_direct_continuation" #f))) (define ##sys#call-with-cthulhu (##core#primitive "C_call_with_cthulhu")) (define values (##core#primitive "C_values")) (define call-with-values (##core#primitive "C_call_with_values")) @@ -2450,28 +2447,6 @@ EOF (after) (##sys#dynamic-unwind winds (fx- n 1)) ) ] ) ) -(define (continuation-capture proc) - (let ([winds ##sys#dynamic-winds] - [k (##core#inline "C_direct_continuation" #f)] ) - (proc (##sys#make-structure 'continuation k winds))) ) - -(define (continuation? x) - (##sys#structure? x 'continuation) ) - -(define ##sys#continuation-graft (##core#primitive "C_continuation_graft")) - -(define (continuation-graft k thunk) - (##sys#check-structure k 'continuation 'continuation-graft) - (let ([winds (##sys#slot k 2)]) - (unless (eq? ##sys#dynamic-winds winds) - (##sys#dynamic-unwind winds (fx- (length ##sys#dynamic-winds) (length winds))) ) - (##sys#continuation-graft k thunk) ) ) - -(define continuation-return - (lambda (k . vals) - (##sys#check-structure k 'continuation 'continuation-return) - (continuation-graft k (lambda () (apply values vals))) ) ) - ;;; Ports: diff --git a/manual/Supported language b/manual/Supported language index 0c5eadfe..20d0128c 100644 --- a/manual/Supported language +++ b/manual/Supported language @@ -27,6 +27,7 @@ * [[Unit utils]] Shell scripting and file operations * [[Unit tcp]] Basic TCP-sockets * [[Unit lolevel]] Low-level operations +* [[Unit continuation]] Continuations --- Previous: [[Using the interpreter]] diff --git a/manual/Unit continuation b/manual/Unit continuation new file mode 100644 index 00000000..3ac54c9b --- /dev/null +++ b/manual/Unit continuation @@ -0,0 +1,62 @@ +[[tags: manual]] +[[toc:]] + +== Unit continuation + +This unit provides a more powerful interface for continuations than that +provided by {{call/cc}}. + +More information about this continuation API can be found in the paper +[[http://repository.readscheme.org/ftp/papers/sw2001/feeley.pdf]] ''A Better +API for first class Continuations'' by Marc Feeley. + + +=== Continuations API + +==== continuation-capture + +<procedure>(continuation-capture PROCEDURE)</procedure> + +Creates a continuation object representing the current continuation and +tail-calls {{PROCEDURE}} with this continuation as the single argument. + + + +==== continuation? + +<procedure>(continuation? X)</procedure> + +Returns {{#t}} if {{X}} is a continuation object, or {{#f}} otherwise. Please +note that this applies only to continuations created by the Continuation API, +but not by call/cc, i.e.: {{(call-with-current-continuation continuation?)}} +returns {{#f}}, whereas {{(continuation-capture continuation?)}} returns +{{#t}}. + + +==== continuation-graft + +<procedure>(continuation-graft CONT THUNK)</procedure> + +Calls the procedure {{THUNK}} with no arguments and the implicit continuation +{{CONT}}. + + +==== continuation-return + +<procedure>(continuation-return CONT VALUE ...)</procedure> + +Returns the value(s) to the continuation {{CONT}}. {{continuation-return}} could +be implemented like this: + +<enscript highlight=scheme> +(define (continuation-return k . vals) + (continuation-graft + k + (lambda () (apply values vals)))) +</enscript> + + +---- +Previous: [[Unit lolevel]] + +Next: [[Interface to external functions and variables]] diff --git a/manual/Unit library b/manual/Unit library index 0c65ef4b..e915cc3e 100644 --- a/manual/Unit library +++ b/manual/Unit library @@ -1227,53 +1227,6 @@ Ignores {{ARGUMENT ...}} and returns an unspecified value. An alias for {{call-with-current-continuation}}. -==== continuation-capture - -<procedure>(continuation-capture PROCEDURE)</procedure> - -Creates a continuation object representing the current continuation and -tail-calls {{PROCEDURE}} with this continuation as the single argument. - -More information about this continuation API can be found in the paper -[[http://repository.readscheme.org/ftp/papers/sw2001/feeley.pdf]] ''A Better -API for first class Continuations'' by Marc Feeley. - - -==== continuation? - -<procedure>(continuation? X)</procedure> - -Returns {{#t}} if {{X}} is a continuation object, or {{#f}} otherwise. Please -note that this applies only to continuations created by the Continuation API, -but not by call/cc, i.e.: {{(call-with-current-continuation continuation?)}} -returns {{#f}}, whereas {{(continuation-capture continuation?)}} returns -{{#t}}. - - -==== continuation-graft - -<procedure>(continuation-graft CONT THUNK)</procedure> - -Calls the procedure {{THUNK}} with no arguments and the implicit continuation -{{CONT}}. - - -==== continuation-return - -<procedure>(continuation-return CONT VALUE ...)</procedure> - -Returns the value(s) to the continuation {{CONT}}. {{continuation-return}} could -be implemented like this: - -<enscript highlight=scheme> -(define (continuation-return k . vals) - (continuation-graft - k - (lambda () (apply values vals)) ) ) -</enscript> - - - === Setters SRFI-17 is fully implemented. For more information see: diff --git a/manual/Unit lolevel b/manual/Unit lolevel index 9c8b3a9e..28d2b063 100644 --- a/manual/Unit lolevel +++ b/manual/Unit lolevel @@ -687,4 +687,4 @@ identical in behaviour to the result of {{OLD}}: --- Previous: [[Unit tcp]] -Next: [[Interface to external functions and variables]] +Next: [[Unit continuation]] diff --git a/modules.scm b/modules.scm index 9f906453..32a66a40 100644 --- a/modules.scm +++ b/modules.scm @@ -931,6 +931,7 @@ (##sys#register-primitive-module 'r5rs-null '() r4rs-syntax)) (##sys#register-module-alias 'r5rs 'scheme) +(##sys#register-module-alias 'continuation 'chicken.continuation) (##sys#register-module-alias 'data-structures 'chicken.data-structures) (##sys#register-module-alias 'extras 'chicken.extras) (##sys#register-module-alias 'expand 'chicken.expand) diff --git a/rules.make b/rules.make index ad8b8d02..fa77c327 100644 --- a/rules.make +++ b/rules.make @@ -37,7 +37,7 @@ SETUP_API_OBJECTS_1 = setup-api setup-download LIBCHICKEN_SCHEME_OBJECTS_1 = \ library eval repl data-structures ports files extras lolevel utils tcp srfi-4 \ - $(POSIXFILE) internal irregex scheduler debugger-client \ + continuation $(POSIXFILE) internal irregex scheduler debugger-client \ profiler stub expand modules chicken-syntax chicken-ffi-syntax build-version LIBCHICKEN_OBJECTS_1 = $(LIBCHICKEN_SCHEME_OBJECTS_1) runtime LIBCHICKEN_SHARED_OBJECTS = $(LIBCHICKEN_OBJECTS_1:=$(O)) @@ -729,6 +729,8 @@ chicken-syntax.c: $(SRCDIR)chicken-syntax.scm $(SRCDIR)common-declarations.scm $ $(bootstrap-lib) chicken-ffi-syntax.c: $(SRCDIR)chicken-ffi-syntax.scm $(SRCDIR)common-declarations.scm $(SRCDIR)mini-srfi-1.scm $(bootstrap-lib) +continuation.c: $(SRCDIR)continuation.scm $(SRCDIR)common-declarations.scm + $(bootstrap-lib) -emit-import-library chicken.continuation data-structures.c: $(SRCDIR)data-structures.scm $(SRCDIR)common-declarations.scm $(bootstrap-lib) -emit-import-library chicken.data-structures ports.c: $(SRCDIR)ports.scm $(SRCDIR)common-declarations.scm diff --git a/tests/runtests.sh b/tests/runtests.sh index 4756fafe..b279ae88 100755 --- a/tests/runtests.sh +++ b/tests/runtests.sh @@ -39,6 +39,7 @@ for x in \ chicken.import.so csi.import.so types.db \ setup-api.so setup-api.import.so srfi-4.import.so \ setup-download.so setup-download.import.so \ + chicken.continuation.import.so \ chicken.data-structures.import.so \ chicken.extras.import.so \ chicken.files.import.so \ diff --git a/types.db b/types.db index dad70c1b..93cd59f5 100644 --- a/types.db +++ b/types.db @@ -935,11 +935,11 @@ (condition? (#(procedure #:pure #:predicate (struct condition)) condition? (*) boolean)) (condition->list (#(procedure #:clean #:enforce) condition->list ((struct condition)) (list-of (pair symbol *)))) -(continuation-capture (#(procedure #:enforce) continuation-capture ((procedure ((struct continuation)) . *)) *)) -(continuation-graft (#(procedure #:clean #:enforce) continuation-graft ((struct continuation) (procedure () . *)) *)) -(continuation-return (#(procedure #:enforce) continuation-return ((struct continuation) #!rest) . *)) ;XXX make return type more specific? -(continuation? (#(procedure #:pure #:predicate (struct continuation)) continuation? (*) boolean)) +(chicken.continuation#continuation-capture (#(procedure #:enforce) chicken.continuation#continuation-capture ((procedure ((struct continuation)) . *)) *)) +(chicken.continuation#continuation-graft (#(procedure #:clean #:enforce) chicken.continuation#continuation-graft ((struct continuation) (procedure () . *)) *)) +(chicken.continuation#continuation-return (#(procedure #:enforce) chicken.continuation#continuation-return ((struct continuation) #!rest) . *)) ;XXX make return type more specific? +(chicken.continuation#continuation? (#(procedure #:pure #:predicate (struct continuation)) chicken.continuation#continuation? (*) boolean)) (copy-read-table (#(procedure #:clean #:enforce) copy-read-table ((struct read-table)) (struct read-table)))Trap