revise scribble/srcdoc so it is extensible; tweak bytecode optimizer to drop more omittable expressions
svn: r9028 original commit: f5e0fd35f53eddf5e51843542103f5ea85d429a2
This commit is contained in:
parent
6c435c4e12
commit
4809dfdeb5
|
@ -35,16 +35,14 @@
|
||||||
(mod-beg
|
(mod-beg
|
||||||
content ...))
|
content ...))
|
||||||
(with-syntax ([(content ...)
|
(with-syntax ([(content ...)
|
||||||
(map
|
(apply
|
||||||
strip-context
|
append
|
||||||
(apply
|
(map (lambda (c)
|
||||||
append
|
(syntax-case c (#%plain-app void quote-syntax provide/doc)
|
||||||
(map (lambda (c)
|
[(#%plain-app void (quote-syntax (provide/doc spec ...)))
|
||||||
(syntax-case c (#%plain-app void quote-syntax provide/doc)
|
(syntax->list #'(spec ...))]
|
||||||
[(#%plain-app void (quote-syntax (provide/doc spec ...)))
|
[_ null]))
|
||||||
(syntax->list #'(spec ...))]
|
(syntax->list #'(content ...))))]
|
||||||
[_ null]))
|
|
||||||
(syntax->list #'(content ...)))))]
|
|
||||||
[(req ...)
|
[(req ...)
|
||||||
(map
|
(map
|
||||||
strip-context
|
strip-context
|
||||||
|
@ -57,16 +55,34 @@
|
||||||
[(#%plain-app void (quote-syntax (require/doc spec ...)))
|
[(#%plain-app void (quote-syntax (require/doc spec ...)))
|
||||||
(syntax->list #'(spec ...))]
|
(syntax->list #'(spec ...))]
|
||||||
[_ null]))
|
[_ null]))
|
||||||
(syntax->list #'(content ...)))))])
|
(syntax->list #'(content ...)))))]
|
||||||
|
[orig-tag (datum->syntax #f 'orig)])
|
||||||
#`(begin
|
#`(begin
|
||||||
(#%require (for-label #,(strip-context #'lang))
|
(#%require (for-label #,(strip-context #'lang))
|
||||||
(for-label #,(strip-context #'orig-path))
|
(for-label #,(strip-context #'orig-path))
|
||||||
req ...)
|
req ...)
|
||||||
(def-it content) ...))])))]))
|
(def-it orig-tag content) ...))])))]))
|
||||||
|
|
||||||
(define-syntax def-it
|
(define-for-syntax (revise-context c orig-tag new-tag tag)
|
||||||
(syntax-rules ()
|
(cond
|
||||||
[(_ ((rename old-id id) contract desc))
|
[(syntax? c)
|
||||||
(def-it (id contract desc))]
|
(datum->syntax
|
||||||
[(_ (id (-> arg ... result) desc))
|
(if (bound-identifier=? tag (datum->syntax c 'tag))
|
||||||
(defproc (id arg ...) result . desc)]))
|
new-tag
|
||||||
|
orig-tag)
|
||||||
|
(revise-context (syntax-e c) orig-tag new-tag tag)
|
||||||
|
c)]
|
||||||
|
[(pair? c) (cons (revise-context (car c) orig-tag new-tag tag)
|
||||||
|
(revise-context (cdr c) orig-tag new-tag tag))]
|
||||||
|
[else c]))
|
||||||
|
|
||||||
|
(define-syntax (def-it stx)
|
||||||
|
(syntax-local-introduce
|
||||||
|
(syntax-case (syntax-local-introduce stx) ()
|
||||||
|
[(_ orig-path (reqs doc tag))
|
||||||
|
(let ([new-tag ((make-syntax-introducer)
|
||||||
|
(datum->syntax #'orig-path 'new-tag))]
|
||||||
|
[orig-tag #'orig-path])
|
||||||
|
#`(begin
|
||||||
|
(require . #,(revise-context #'reqs orig-tag new-tag #'tag))
|
||||||
|
#,(revise-context #'doc orig-tag new-tag #'tag)))])))
|
||||||
|
|
|
@ -713,7 +713,9 @@
|
||||||
(raise-syntax-error 'defproc "bad prototype" stx)]))
|
(raise-syntax-error 'defproc "bad prototype" stx)]))
|
||||||
|
|
||||||
(define-syntax (result-contract stx)
|
(define-syntax (result-contract stx)
|
||||||
(syntax-case stx ()
|
(syntax-case stx (values)
|
||||||
|
[(_ (values c ...))
|
||||||
|
#'(list (schemeblock0 c) ...)]
|
||||||
[(_ c)
|
[(_ c)
|
||||||
(if (string? (syntax-e #'c))
|
(if (string? (syntax-e #'c))
|
||||||
(raise-syntax-error
|
(raise-syntax-error
|
||||||
|
@ -1233,7 +1235,29 @@
|
||||||
(element-width tagged))]
|
(element-width tagged))]
|
||||||
[(short?) (or (flat-size . < . 40)
|
[(short?) (or (flat-size . < . 40)
|
||||||
((length args) . < . 2))]
|
((length args) . < . 2))]
|
||||||
[(res) (result-contract)]
|
[(res) (let ([res (result-contract)])
|
||||||
|
(if (list? res)
|
||||||
|
;; multiple results
|
||||||
|
(if (null? res)
|
||||||
|
'nbsp
|
||||||
|
(let ([w (apply max 0 (map flow-element-width res))])
|
||||||
|
(if (or (ormap table? res)
|
||||||
|
(w . > . 30))
|
||||||
|
(make-table
|
||||||
|
#f
|
||||||
|
(map (lambda (fe)
|
||||||
|
(list (make-flow (list fe))))
|
||||||
|
res))
|
||||||
|
(make-table
|
||||||
|
#f
|
||||||
|
(list
|
||||||
|
(let loop ([res res])
|
||||||
|
(if (null? (cdr res))
|
||||||
|
(list (make-flow (list (car res))))
|
||||||
|
(list* (make-flow (list (car res)))
|
||||||
|
(to-flow (hspace 1))
|
||||||
|
(loop (cdr res))))))))))
|
||||||
|
res))]
|
||||||
[(result-next-line?) ((+ (if short?
|
[(result-next-line?) ((+ (if short?
|
||||||
flat-size
|
flat-size
|
||||||
(+ (prototype-size args max max)
|
(+ (prototype-size args max max)
|
||||||
|
|
15
collects/scribble/provide-doc-transform.ss
Normal file
15
collects/scribble/provide-doc-transform.ss
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#lang scheme/base
|
||||||
|
|
||||||
|
(require (for-syntax scheme/base))
|
||||||
|
|
||||||
|
(provide define-provide/doc-transformer
|
||||||
|
(for-syntax
|
||||||
|
provide/doc-transformer?
|
||||||
|
provide/doc-transformer-proc))
|
||||||
|
|
||||||
|
(begin-for-syntax
|
||||||
|
(define-struct provide/doc-transformer (proc) #:omit-define-syntaxes))
|
||||||
|
|
||||||
|
(define-syntax-rule (define-provide/doc-transformer id rhs)
|
||||||
|
(define-syntax id
|
||||||
|
(make-provide/doc-transformer rhs)))
|
|
@ -1,27 +1,83 @@
|
||||||
#lang scheme/base
|
#lang scheme/base
|
||||||
|
|
||||||
(require scheme/contract)
|
(require scheme/contract
|
||||||
|
(for-syntax scheme/base)
|
||||||
|
"provide-doc-transform.ss")
|
||||||
|
|
||||||
(provide require/doc
|
(provide require/doc
|
||||||
provide/doc)
|
provide/doc
|
||||||
|
proc-doc)
|
||||||
|
|
||||||
(define-syntax-rule (require/doc spec ...)
|
(define-syntax-rule (require/doc spec ...)
|
||||||
(void (quote-syntax (require/doc spec ...))))
|
(void (quote-syntax (require/doc spec ...))))
|
||||||
|
|
||||||
(define-syntax-rule (provide/doc [id contract desc] ...)
|
(define-syntax (provide/doc stx)
|
||||||
(begin
|
(syntax-case stx ()
|
||||||
(void (quote-syntax (provide/doc [id contract desc] ...)))
|
[(_ form ...)
|
||||||
(provide/contracted [id (strip-names contract)]) ...))
|
(let ([forms (syntax->list #'(form ...))])
|
||||||
|
(with-syntax ([((for-provide/contract for-docs) ...)
|
||||||
|
(map (lambda (form)
|
||||||
|
(syntax-case form ()
|
||||||
|
[(id . _)
|
||||||
|
(identifier? #'id)
|
||||||
|
(let ([t (syntax-local-value #'id (lambda () #f))])
|
||||||
|
(unless (provide/doc-transformer? t)
|
||||||
|
(raise-syntax-error
|
||||||
|
#f
|
||||||
|
"not bound as a provide/doc transformer"
|
||||||
|
stx
|
||||||
|
#'id))
|
||||||
|
(let* ([i (make-syntax-introducer)]
|
||||||
|
[i2 (lambda (x) (syntax-local-introduce (i x)))])
|
||||||
|
(let-values ([(p/c d req/d) ((provide/doc-transformer-proc t)
|
||||||
|
(i (syntax-local-introduce form)))])
|
||||||
|
(list (i2 p/c) (list (i2 req/d) (i2 d) (i2 (quote-syntax tag)))))))]
|
||||||
|
[_
|
||||||
|
(raise-syntax-error
|
||||||
|
#f
|
||||||
|
"not a provide/doc sub-form"
|
||||||
|
stx
|
||||||
|
form)]))
|
||||||
|
forms)])
|
||||||
|
(with-syntax ([(p/c ...)
|
||||||
|
(map (lambda (form f)
|
||||||
|
(quasisyntax/loc form
|
||||||
|
(provide/contract #,f)))
|
||||||
|
forms
|
||||||
|
(syntax->list #'(for-provide/contract ...)))])
|
||||||
|
#'(begin
|
||||||
|
p/c ...
|
||||||
|
(void (quote-syntax (provide/doc for-docs ...)))))))]))
|
||||||
|
|
||||||
|
(define-provide/doc-transformer proc-doc
|
||||||
|
(lambda (stx)
|
||||||
|
(syntax-case stx ()
|
||||||
|
[(_ id contract desc)
|
||||||
|
(with-syntax ([(arg ...)
|
||||||
|
(syntax-case #'contract (->d)
|
||||||
|
[(->d (req ...) () result)
|
||||||
|
#'(req ...)]
|
||||||
|
[else
|
||||||
|
(raise-syntax-error
|
||||||
|
#f
|
||||||
|
"unsupported procedure contract form (arguments)"
|
||||||
|
stx
|
||||||
|
#'contract)])]
|
||||||
|
[result
|
||||||
|
(syntax-case #'contract (->d)
|
||||||
|
[(->d reqs opts (values [name res] ...))
|
||||||
|
#'(values res ...)]
|
||||||
|
[(->d reqs opts [name res])
|
||||||
|
#'res]
|
||||||
|
[else
|
||||||
|
(raise-syntax-error
|
||||||
|
#f
|
||||||
|
"unsupported procedure contract form (arguments)"
|
||||||
|
stx
|
||||||
|
#'contract)])])
|
||||||
|
(values
|
||||||
|
#'[id contract]
|
||||||
|
#'(defproc (id arg ...) result . desc)
|
||||||
|
#'(scribble/manual)))])))
|
||||||
|
|
||||||
(define-syntax provide/contracted
|
|
||||||
(syntax-rules (->)
|
|
||||||
[(_ [(rename orig-id new-id) contract])
|
|
||||||
(provide/contract (rename orig-id new-id contract))]
|
|
||||||
[(_ [id contract])
|
|
||||||
(provide/contract [id contract])]))
|
|
||||||
|
|
||||||
(define-syntax strip-names
|
|
||||||
(syntax-rules (->)
|
|
||||||
[(_ (-> [id contract] ... result))
|
|
||||||
(-> contract ... result)]
|
|
||||||
[(_ other) other]))
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user