diff options
| author | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2009-03-01 00:41:08 +0100 | 
|---|---|---|
| committer | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2009-03-01 00:41:08 +0100 | 
| commit | 943e58b83a9c4da34754e8f737e59f2e5a496fc6 (patch) | |
| tree | 9a09d14081657536576fdc1971b569628c1c09e7 /geiser | |
| parent | ceca3e57da983def1e9780d83dab602532d0d328 (diff) | |
| download | geiser-guile-943e58b83a9c4da34754e8f737e59f2e5a496fc6.tar.gz geiser-guile-943e58b83a9c4da34754e8f737e59f2e5a496fc6.tar.bz2  | |
Miscellaneous little fixes.
Diffstat (limited to 'geiser')
| -rw-r--r-- | geiser/introspection.scm | 24 | 
1 files changed, 15 insertions, 9 deletions
diff --git a/geiser/introspection.scm b/geiser/introspection.scm index c7b6de2..0a724f2 100644 --- a/geiser/introspection.scm +++ b/geiser/introspection.scm @@ -59,24 +59,30 @@                 (cons 'position (find-position args form))                 (cons 'module (symbol-module fun)))))) +(define (arglst args kind) +  (let ((args (assq-ref args kind))) +    (cond ((or (not args) (null? args)) '()) +          ((list? args) args) +          (else (list args))))) +  (define (signature fun args) -  (let ((req (assq-ref args 'required)) -        (opt (assq-ref args 'optional)) -        (key (assq-ref args 'keyword)) +  (let ((req (arglst args 'required)) +        (opt (arglst args 'optional)) +        (key (arglst args 'keyword))          (rest (assq-ref args 'rest))) -    (let ((sgn `(,fun ,@(or req '()) -                      ,@(if opt (cons #:optional opt) '()) -                      ,@(if key (cons #:key key) '())))) +    (let ((sgn `(,fun ,@req +                      ,@(if (not (null? opt)) (cons #:opt opt) '()) +                      ,@(if (not (null? key)) (cons #:key key) '()))))        (if rest `(,@sgn #:rest ,rest) sgn))))  (define (find-position args form)    (let* ((lf (length form))           (lf-1 (- lf 1)))      (if (= 1 lf) 0 -        (let ((req (length (or (assq-ref args 'required) '()))) -              (opt (length (or (assq-ref args 'optional) '()))) +        (let ((req (length (arglst args 'required))) +              (opt (length (arglst args 'optional)))                (keys (map (lambda (k) (symbol->keyword (if (list? k) (car k) k))) -                         (or (assq-ref args 'keyword) '()))) +                         (arglst args 'keyword)))                (rest (assq-ref args 'rest)))            (cond ((<= lf (+ 1 req)) lf-1)                  ((<= lf (+ 1 req opt)) (if (> opt 0) lf lf-1))  | 
