diff options
| -rw-r--r-- | geiser/doc.scm | 85 | 
1 files changed, 21 insertions, 64 deletions
| diff --git a/geiser/doc.scm b/geiser/doc.scm index 3f060e3..d951f1c 100644 --- a/geiser/doc.scm +++ b/geiser/doc.scm @@ -37,76 +37,33 @@    #:use-module (oop goops)    #:use-module (srfi srfi-1)) -(define (autodoc form) -  (cond ((null? form) #f) -        ((symbol? form) (describe-application (list form))) -        ((not (pair? form)) #f) -        ((not (list? form)) (autodoc (pair->list form))) -        ((define-head? form) => autodoc) -        (else (autodoc/list form)))) - -(define (autodoc/list form) -  (let ((lst (last form))) -    (cond ((and (symbol? lst) (describe-application (list lst)))) -          ((and (pair? lst) (not (memq (car lst) '(quote))) (autodoc lst))) -          (else (describe-application form))))) - -(define (define-head? form) -  (define defforms '(define define* define-macro define-macro* -                      define-method define-class define-generic)) -  (and (= 2 (length form)) -       (memq (car form) defforms) -       (car form))) - -(define (describe-application form) -  (let* ((fun (car form)) -         (args (obj-args (symbol->object fun)))) +(define (autodoc ids) +  (if (not (list? ids)) +      '() +      (map (lambda (id) (or (autodoc* id) (list id))) ids))) + +(define (autodoc* id) +  (let ((args (obj-args (symbol->object id))))      (and args -         (list (cons 'signature (signature fun args)) -               (cons 'position (find-position args form)) -               (cons 'module (symbol-module fun)))))) +         `(,@(signature id args) +           (module . ,(symbol-module id))))))  (define (object-signature name obj)    (let ((args (obj-args obj)))      (and args (signature name args)))) -(define (signature fun args) -  (let ((req (arglst args 'required)) -        (opt (arglst args 'optional)) -        (key (arglst args 'keyword)) -        (rest (assq-ref args 'rest))) -    (let ((sgn `(,fun ,@req -                      ,@(if (not (null? opt)) (cons 'geiser-opt_marker opt) '()) -                      ,@(if (not (null? key)) (cons 'geiser-key_maker key) '())))) -      (if rest `(,@sgn geiser-rest_marker ,rest) sgn)))) - -(define (find-position args form) -  (let* ((lf (length form)) -         (lf-1 (- lf 1))) -    (if (= 1 lf) 0 -        (let ((req (length (arglst args 'required))) -              (opt (length (arglst args 'optional))) -              (keys (map (lambda (k) (symbol->keyword (if (list? k) (car k) k))) -                         (arglst args 'keyword))) -              (rest (assq-ref args 'rest))) -          (cond ((<= lf (+ 1 req)) lf-1) -                ((<= lf (+ 1 req opt)) (if (> opt 0) lf lf-1)) -                ((or (memq (last form) keys) -                     (memq (car (take-right form 2)) keys)) => -                 (lambda (sl) -                   (+ 2 req -                      (if (> opt 0) (+ 1 opt) 0) -                      (- (length keys) (length sl))))) -                (else (+ 1 req -                         (if (> opt 0) (+ 1 opt) 0) -                         (if (null? keys) 0 (+ 1 (length keys))) -                         (if rest 2 0)))))))) - -(define (arglst args kind) -  (let ((args (assq-ref args kind))) -    (cond ((or (not args) (null? args)) '()) -          ((list? args) args) -          (else (list args))))) +(define (signature id args) +  (define (arglst kind) +    (let ((args (assq-ref args kind))) +      (cond ((or (not args) (null? args)) '()) +            ((list? args) args) +            (else (list args))))) +  `(,id +    (required ,@(arglst 'required)) +    (optional ,@(arglst 'optional) +              ,@(let ((rest (assq-ref args 'rest))) +                  (if rest (list "...") '()))) +    (key ,@(arglst 'keyword))))  (define (obj-args obj)    (cond ((not obj) #f) | 
