manual-unit.rkt (2121B)
1 #lang scheme/base 2 (require "../decode.rkt" 3 "../struct.rkt" 4 "manual-vars.rkt" 5 "manual-bind.rkt" 6 "manual-ex.rkt" 7 "manual-proc.rkt" 8 racket/contract/base 9 (for-syntax scheme/base) 10 (for-label scheme/base)) 11 12 (provide defsignature 13 defsignature/splice 14 sigelem) 15 16 (define-syntax-rule (defsignature name (super ...) body ...) 17 (with-togetherable-racket-variables 18 () 19 () 20 (*defsignature (quote-syntax name) 21 (list (quote-syntax super) ...) 22 (lambda () (list body ...)) 23 #t))) 24 25 (define-syntax-rule (defsignature/splice name (super ...) body ...) 26 (with-togetherable-racket-variables 27 () 28 () 29 (*defsignature (quote-syntax name) 30 (list (quote-syntax super) ...) 31 (lambda () (list body ...)) 32 #f))) 33 34 (define-struct sig-desc (in)) 35 (define (signature-desc . l) 36 (make-sig-desc l)) 37 38 (provide/contract 39 [signature-desc (() () #:rest (listof pre-flow?) . ->* . sig-desc?)]) 40 41 (define (*defsignature stx-id supers body-thunk indent?) 42 (*defthing 43 "signature" 44 #t 45 (list stx-id) 46 (list (syntax-e stx-id)) 47 #t 48 (list (make-element #f '("signature"))) 49 (lambda () 50 (define in 51 (parameterize ([current-signature (make-sig stx-id)]) (body-thunk))) 52 (if indent? 53 (let-values ([(pre-body post-body) 54 (let loop ([in in][pre-accum null]) 55 (cond [(null? in) (values (reverse pre-accum) null)] 56 [(whitespace? (car in)) 57 (loop (cdr in) (cons (car in) pre-accum))] 58 [(sig-desc? (car in)) 59 (loop (cdr in) 60 (append (reverse (sig-desc-in (car in))) 61 pre-accum))] 62 [else (values (reverse pre-accum) in)]))]) 63 `(,@pre-body 64 ,(make-blockquote 65 "leftindent" 66 (flow-paragraphs (decode-flow post-body))))) 67 in))))