Advertisement
Guest User

Untitled

a guest
Apr 26th, 2017
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 2.08 KB | None | 0 0
  1. (library (contract)
  2.   (export
  3.    ->
  4.    listof vectorof
  5.    any/c or/c
  6.    integer-in fixnum-in flonum-in char-in
  7.    define/contract)
  8.   (import (rnrs (6))
  9.           (srfi srfi-1))
  10.   ;; auxiliary keyword ->
  11.   (define-syntax ->
  12.     (lambda (x)
  13.       (syntax-violation #f "misplaced aux keyword" x)))
  14.   ;;;;;;;;;;;;;;;;;;;;
  15.   ;; Useful predicate creators
  16.   ;;;;;;;;;;;;;;;;;;;;
  17.   (define (listof pred?)
  18.     (lambda (x)
  19.       (if (list? x)
  20.           (every pred? x)
  21.           #f)))
  22.  
  23.   (define (vectorof pred?)
  24.     (lambda (x)
  25.       (let ([len (vector-length x)])
  26.         (let loop ([i 0])
  27.           (cond
  28.            [(= i len) #t]
  29.            [(pred? (vector-ref x i)) (loop (+ i 1))]
  30.            [else #f])))))
  31.  
  32.   (define (any/c x)
  33.     #t)
  34.  
  35.   (define (or/c . preds)
  36.     (lambda (x)
  37.       (let loop ([preds preds])
  38.         (cond
  39.          [(null? preds) #f]
  40.          [((car preds) x)]
  41.          [else (loop (cdr preds))]))))
  42.  
  43.   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  44.   ;; Number predicate creators ;;;;;;;
  45.   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  46.  
  47.   (define (in-range/c a b pred? st? bt? expected)
  48.     (lambda (x)
  49.       (if (and (pred? a) (pred? b))
  50.           (and (bt? x a) (st? x b))
  51.           (raise "error"))))
  52.  
  53.   (define (between/c a b)
  54.     (in-range/c a b real? <= >= 'real))
  55.   (define (integer-in a b)
  56.     (in-range/c a b integer? <= >= 'integer))
  57.   (define (fixnum-in a b)
  58.     (in-range/c a b fixnum? fx<=? fx>=? 'fixnum))
  59.   (define (flonum-in a b)
  60.     (in-range/c a b flonum? fl<=? fl>=? 'flonum))
  61.   (define (char-in a b)
  62.     (in-range/c a b char? char<=? char>=? 'char))
  63.  
  64.   (define-syntax define/contract
  65.     (syntax-rules (->)
  66.       [(define/contract (id var ...)
  67.          (-> pred? ... return-pred?) body ...)
  68.        (define (id var ...)
  69.          (define (%INTERNAL_PROC)
  70.            body ...)
  71.          (unless (pred? var) (error define/contract "contract error")) ...
  72.          (let ([%return-value (%INTERNAL_PROC)])
  73.            (if (return-pred? %return-value)
  74.                %return-value
  75.                (error 'define/contract "contract error"))))])))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement