changed the implementation to call/cc
This commit is contained in:
@@ -12,6 +12,40 @@
|
|||||||
;; define/return/contract
|
;; define/return/contract
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(define-syntax define/contract/return
|
||||||
|
(syntax-rules ()
|
||||||
|
((_ (name . formals) return (c ... last-pred) b1 ...)
|
||||||
|
(define/contract (name . formals)
|
||||||
|
(c ... last-pred)
|
||||||
|
(call/cc
|
||||||
|
(λ (ret)
|
||||||
|
(define/contract
|
||||||
|
(make-ret x)
|
||||||
|
(-> any/c last-pred)
|
||||||
|
x)
|
||||||
|
(define (return x)
|
||||||
|
(ret (make-ret x)))
|
||||||
|
|
||||||
|
b1
|
||||||
|
...
|
||||||
|
)
|
||||||
|
)))
|
||||||
|
((_ name last-pred value)
|
||||||
|
(define/contract name
|
||||||
|
last-pred
|
||||||
|
(call/cc
|
||||||
|
(λ (ret)
|
||||||
|
(define/contract
|
||||||
|
(make-ret x)
|
||||||
|
(-> any/c last-pred)
|
||||||
|
x)
|
||||||
|
(define (return x)
|
||||||
|
(ret (make-ret x)))
|
||||||
|
value))))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
#|
|
||||||
(define-syntax def-returner
|
(define-syntax def-returner
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
((_ pred name)
|
((_ pred name)
|
||||||
@@ -52,3 +86,4 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|#
|
||||||
|
|||||||
@@ -1,13 +1,29 @@
|
|||||||
#lang racket/base
|
#lang racket/base
|
||||||
|
|
||||||
(provide define/return
|
(provide define/return
|
||||||
return
|
;return
|
||||||
)
|
)
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; define/return
|
;; define/return
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(define-syntax define/return
|
||||||
|
(syntax-rules ()
|
||||||
|
((_ def return
|
||||||
|
b1 ...)
|
||||||
|
(define def
|
||||||
|
(call/cc
|
||||||
|
(λ (return)
|
||||||
|
b1
|
||||||
|
...)))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
#|
|
||||||
|
|
||||||
|
|
||||||
(struct exn:return exn (value) #:transparent)
|
(struct exn:return exn (value) #:transparent)
|
||||||
|
|
||||||
(define-syntax raise-return
|
(define-syntax raise-return
|
||||||
@@ -76,4 +92,4 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|#
|
||||||
Reference in New Issue
Block a user