separated contract form from default form.
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
#lang racket/base
|
||||
|
||||
(require "main.rkt")
|
||||
|
||||
(provide define/contract/return
|
||||
(all-from-out racket/contract)
|
||||
(all-from-out "main.rkt")
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; define/return/contract
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(define-syntax def-returner
|
||||
(syntax-rules ()
|
||||
((_ pred name)
|
||||
(define/contract (name x)
|
||||
(-> any/c pred)
|
||||
(return-value x))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(define-syntax call-returner
|
||||
(syntax-rules ()
|
||||
((_ x name)
|
||||
(name x))))
|
||||
|
||||
(define-syntax define/contract/return
|
||||
(syntax-rules ()
|
||||
((_ (name . formals) (c ... last-pred) b1 ...)
|
||||
(define/contract (name . formals)
|
||||
(c ... last-pred)
|
||||
|
||||
(let ((ret (λ (x)
|
||||
(def-returner last-pred name)
|
||||
(call-returner x name))))
|
||||
(with-handlers ([exn:return? ret])
|
||||
b1
|
||||
...)))
|
||||
)
|
||||
((_ name last-pred value)
|
||||
(define/contract name
|
||||
last-pred
|
||||
(let ((ret (λ (x)
|
||||
(def-returner last-pred name)
|
||||
(call-returner x name))))
|
||||
(with-handlers ([exn:return? ret])
|
||||
value)))
|
||||
)
|
||||
)
|
||||
)
|
||||
Reference in New Issue
Block a user