;;; -*- Mode: Scheme -*- ;;;; Shift & Reset ;;;; Composable Continuation Operators in Terms of CWCC ;;; This code is written by Taylor Campbell and placed in the Public ;;; Domain. All warranties are disclaimed. (define *meta-continuation* (lambda (value) (error "No top-level RESET" value))) (define-syntax reset (syntax-rules () ((RESET body) (LET ((MC *META-CONTINUATION*)) (CALL-WITH-CURRENT-CONTINUATION (LAMBDA (K) (SET! *META-CONTINUATION* (LAMBDA (VALUE) (SET! *META-CONTINUATION* MC) (K VALUE))) (LET ((RESULT body)) ;** Do not beta-substitute!! (*META-CONTINUATION* RESULT)))))))) (define-syntax shift (syntax-rules () ((SHIFT var body) (CALL-WITH-CURRENT-CONTINUATION (LAMBDA (K) (LET ((RESULT (LET ((var (LAMBDA (VALUE) (RESET (K VALUE))))) body))) ;** Do not beta-substitute!! (*META-CONTINUATION* RESULT)))))))