diff --git a/ice-9/session.scm b/ice-9/session.scm index c43402efc..3b2abcb9e 100644 --- a/ice-9/session.scm +++ b/ice-9/session.scm @@ -123,3 +123,42 @@ (cond ((procedure? obj) (procedure-source obj)) ((macro? obj) (procedure-source (macro-transformer obj))) (else #f))) + +(define-public (arity obj) + (let ((arity (procedure-property obj 'arity))) + (display (car arity)) + (cond ((caddr arity) + (display " or more")) + ((not (zero? (cadr arity))) + (display " required and ") + (display (cadr arity)) + (display " optional"))) + (if (and (not (caddr arity)) + (= (car arity) 1) + (<= (cadr arity) 1)) + (display " argument") + (display " arguments")) + (if (closure? obj) + (let ((formals (cadr (procedure-source obj)))) + (if (pair? formals) + (begin + (display ": `") + (display (car formals)) + (let loop ((ls (cdr formals))) + (cond ((null? ls) + (display #\')) + ((not (pair? ls)) + (display "', the rest in `") + (display ls) + (display #\')) + (else + (if (pair? (cdr ls)) + (display "', `") + (display "' and `")) + (display (car ls)) + (loop (cdr ls)))))) + (begin + (display " in `") + (display formals) + (display #\'))))) + (display ".\n")))