racket/collects/redex/private/loc-wrapper-ct.rkt
2010-04-27 16:50:15 -06:00

99 lines
3.5 KiB
Racket

#lang scheme/base
(require (for-template scheme/base)
(for-template "loc-wrapper-rt.ss")
"term-fn.ss")
(provide to-lw/proc to-lw/uq/proc is-term-fn?)
;; this parameter allows define-metafunction to
;; communicate which name is the recursive calls
;; to the typesetting code, since the let-term-fn
;; won't have been expanded before to-lw/proc
;; is called.
(define is-term-fn? (make-parameter (λ (x) #f)))
(define (process-arg stx quote-depth)
(define quoted? (quote-depth . > . 0))
(define-values (op cl)
(if (syntax? stx)
(case (syntax-property stx 'paren-shape)
[(#\{) (values "{" "}")]
[(#\[) (values "[" "]")]
[else (values "(" ")")])
(values #f #f)))
(define (reader-shorthand arg qd-delta mrk)
#`(init-loc-wrapper
(list (init-loc-wrapper #,mrk
#,(syntax-line stx)
#,(syntax-column stx)
#,quoted?)
'spring
#,(process-arg arg (+ quote-depth qd-delta)))
#,(syntax-line stx)
#,(syntax-column stx)
#,quoted?))
(define (handle-sequence qd-delta)
#`(init-loc-wrapper
(list (init-loc-wrapper #,op #,(syntax-line stx) #,(syntax-column stx) #,quoted?)
#,@(map (λ (x) (process-arg x (+ qd-delta quote-depth))) (syntax->list stx))
(init-loc-wrapper #,cl #f #f #,quoted?))
#,(syntax-line stx)
#,(syntax-column stx)
#,quoted?))
(syntax-case* stx (name unquote quote unquote-splicing term) (λ (x y) (eq? (syntax-e x) (syntax-e y)))
['a (reader-shorthand #'a +1 (if (= quote-depth 0) "" "'"))]
[,a (reader-shorthand #'a -1 (if (= quote-depth 1) "" ","))]
[,@a (reader-shorthand #'a -1 (if (= quote-depth 1) "" ",@"))]
[(term a)
(if (= quote-depth 0)
#`(init-loc-wrapper
(list (init-loc-wrapper "" #,(syntax-line stx) #,(syntax-column stx) #,quoted?)
'spring
#,(process-arg (cadr (syntax->list stx)) (+ quote-depth 1)))
#,(syntax-line stx)
#,(syntax-column stx)
#,quoted?)
(handle-sequence +1))]
[(a ...)
(handle-sequence 0)]
[(a b ... . c)
#`(init-loc-wrapper
(list (init-loc-wrapper #,op #,(syntax-line stx) #,(syntax-column stx) #,quoted?)
#,@(map (λ (x) (process-arg x quote-depth)) (syntax->list (syntax (a b ...))))
(init-loc-wrapper #," . " #f #f #,quoted?)
#,(process-arg #'c quote-depth)
(init-loc-wrapper #,cl #f #f #,quoted?))
#,(syntax-line stx)
#,(syntax-column stx)
#,quoted?)]
[x
(and (identifier? #'x)
(or (term-fn? (syntax-local-value #'x (λ () #f)))
((is-term-fn?) #'x)))
#`(make-lw
'#,(syntax-e #'x)
#,(syntax-line stx)
#f
#,(syntax-column stx)
#f
#f
#t)]
[x
(identifier? #'x)
#`(init-loc-wrapper
'#,(syntax-e #'x)
#,(syntax-line stx)
#,(syntax-column stx)
#,quoted?)]
[x
#`(init-loc-wrapper
#,(let ([base (syntax-e #'x)])
(if (string? base)
#`(rewrite-quotes #,(format "~s" base))
(format "~s" (syntax-e #'x))))
#,(syntax-line stx)
#,(syntax-column stx)
#,quoted?)]))
(define (to-lw/proc stx) #`(add-spans #,(process-arg stx 1)))
(define (to-lw/uq/proc stx) #`(add-spans #,(process-arg stx 0)))