Advertisement
Guest User

Untitled

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