changed the implementation to call/cc

This commit is contained in:
2026-05-11 16:50:26 +02:00
parent cde399ded9
commit 2fb61721f9
2 changed files with 53 additions and 2 deletions
+35
View File
@@ -12,6 +12,40 @@
;; 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
(syntax-rules ()
((_ pred name)
@@ -52,3 +86,4 @@
)
)
|#
+18 -2
View File
@@ -1,13 +1,29 @@
#lang racket/base
(provide define/return
return
;return
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; define/return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-syntax define/return
(syntax-rules ()
((_ def return
b1 ...)
(define def
(call/cc
(λ (return)
b1
...)))
)
)
)
#|
(struct exn:return exn (value) #:transparent)
(define-syntax raise-return
@@ -76,4 +92,4 @@
)
)
)
|#