diff --git a/collects/scribble/srcdoc.ss b/collects/scribble/srcdoc.ss index 01a812d4..9817d3a1 100644 --- a/collects/scribble/srcdoc.ss +++ b/collects/scribble/srcdoc.ss @@ -6,7 +6,9 @@ (provide require/doc provide/doc - proc-doc) + parameter-doc + proc-doc + proc-doc/names) (define-syntax-rule (require/doc spec ...) (void (quote-syntax (require/doc spec ...)))) @@ -53,26 +55,18 @@ (lambda (stx) (syntax-case stx () [(_ id contract desc) - (with-syntax ([(arg ...) - (syntax-case #'contract (->d) - [(->d (req ...) () result) - #'(req ...)] + (with-syntax ([((arg ...) result) + (syntax-case #'contract (->d -> values) + [(->d (req ...) () (values [name res] ...)) + #'((req ...) (values res ...))] + [(->d (req ...) () [name res]) + #'((req ...) res)] + [(-> result) + #'(() result)] [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)" + "unsupported procedure contract form (no argument names)" stx #'contract)])]) (values @@ -80,4 +74,58 @@ #'(defproc (id arg ...) result . desc) #'(scribble/manual)))]))) - +(define-provide/doc-transformer proc-doc/names + (lambda (stx) + (syntax-case stx () + [(_ id contract names desc) + (with-syntax ([header + (syntax-case #'(contract names) (->d -> values) + [((-> ctcs ... result) (arg-names ...)) + (begin + (unless (= (length (syntax->list #'(ctcs ...))) + (length (syntax->list #'(arg-names ...)))) + (raise-syntax-error #f "mismatched argument list and domain contract count" stx)) + #'([(id (arg-names ctcs) ...) result]))] + + [((->* (mandatory ...) (optional ...) result) + ((mandatory-names ...) + ((optional-names optional-default) ...))) + (begin + (unless (= (length (syntax->list #'(mandatory-names ...))) + (length (syntax->list #'(mandatory ...)))) + (raise-syntax-error #f "mismatched mandatory argument list and domain contract count" stx)) + (unless (= (length (syntax->list #'(optional-names ...))) + (length (syntax->list #'(optional ...)))) + (raise-syntax-error #f "mismatched mandatory argument list and domain contract count" stx)) + #'([(id (mandatory-names mandatory) ... (optional-names optional optional-default) ...) + result]))] + [((case-> (-> doms ... rng) ...) + ((args ...) ...)) + (begin + (for-each + (λ (doms args) + (unless (= (length (syntax->list doms)) + (length (syntax->list args))) + (raise-syntax-error #f "mismatched case argument list and domain contract" stx))) + (syntax->list #'((doms ...) ...)) + (syntax->list #'((args ...) ...))) + #'([(id (args doms) ...) rng] ...))] + [else + (raise-syntax-error + #f + "unsupported procedure contract form (no argument names)" + stx + #'contract)])]) + (values + #'[id contract] + #'(defproc* header . desc) + #'(scribble/manual)))]))) + +(define-provide/doc-transformer parameter-doc + (lambda (stx) + (syntax-case stx (parameter/c) + [(_ id (parameter/c contract) arg-id desc) + (values + #'[id (parameter/c contract)] + #'(defparam id arg-id contract . desc) + #'(scribble/manual))])))