better procedure-arguments for interpreted procs with opt, rest, kwargs
authorAndy Wingo <wingo@pobox.com>
Fri, 6 Jul 2012 10:19:12 +0000 (12:19 +0200)
committerAndy Wingo <wingo@pobox.com>
Fri, 6 Jul 2012 10:19:12 +0000 (12:19 +0200)
* module/ice-9/session.scm (procedure-arguments): Arrange to interpret
  numbers in the "req" and "opt" positions of an 'arglist as N arguments
  with unknown name.

* module/ice-9/eval.scm (primitive-eval): Set 'arglist on "complex"
  procedures.  Fixes http://bugs.gnu.org/10922.

* test-suite/tests/session.test ("procedure-arguments"): Add a test.

module/ice-9/eval.scm
module/ice-9/session.scm
test-suite/tests/session.test

index 74b8532..81b9538 100644 (file)
       (define (set-procedure-arity! proc)
         (let lp ((alt alt) (nreq nreq) (nopt nopt) (rest? rest?))
           (if (not alt)
-              (set-procedure-minimum-arity! proc nreq nopt rest?)
+              (begin
+                (set-procedure-property! proc 'arglist
+                                         (list nreq
+                                               nopt
+                                               (if kw (cdr kw) '())
+                                               (and kw (car kw))
+                                               (and rest? '_)))
+                (set-procedure-minimum-arity! proc nreq nopt rest?))
               (let* ((nreq* (cadr alt))
                      (rest?* (if (null? (cddr alt)) #f (caddr alt)))
                      (tail (and (pair? (cddr alt)) (pair? (cdddr alt)) (cdddr alt)))
index 0eeed86..ce1bcac 100644 (file)
@@ -511,8 +511,12 @@ The alist keys that are currently defined are `required', `optional',
    ((procedure-property proc 'arglist)
     => (match-lambda
         ((req opt keyword aok? rest)
-         `((required . ,req)
-           (optional . ,opt)
+         `((required . ,(if (number? req)
+                            (make-list req '_)
+                            req))
+           (optional . ,(if (number? opt)
+                            (make-list opt '_)
+                            opt))
            (keyword . ,keyword)
            (allow-other-keys? . ,aok?)
            (rest . ,rest)))))
index 242ecf9..ec992f1 100644 (file)
@@ -20,6 +20,7 @@
 
 (define-module (test-suite session)
   #:use-module (test-suite lib)
+  #:use-module (ice-9 match)
   #:use-module (system base compile)
   #:use-module (ice-9 session))
 
     (let* ((proc (compile '(lambda (a b) #f) #:to 'value))
            (args (procedure-arguments proc)))
       (set-procedure-property! proc 'arglist (map cdr args))
-      (equal? args (procedure-arguments proc)))))
+      (equal? args (procedure-arguments proc))))
+
+  (pass-if "interpreted procedures (simple)"
+    (match (procedure-arguments
+            (eval '(lambda (x y) #f) (current-module)))
+      (((required _ _)
+        (optional)
+        (keyword)
+        (allow-other-keys? . #f)
+        (rest . #f))
+       #t)
+      (_ #f)))
+
+  (pass-if "interpreted procedures (complex)"
+    (match (procedure-arguments
+            (eval '(lambda* (a b #:optional c #:key d) #f) (current-module)))
+      (((required _ _)
+        (optional _)
+        (keyword (#:d . 3))
+        (allow-other-keys? . #f)
+        (rest . #f))
+       #t)
+      (_ #f))))
 
 ;;; Local Variables:
 ;;; eval: (put 'pass-if-valid-arguments 'scheme-indent-function 1)