(define (ac-call fn args env) (let* ((afn (ac fn env)) (macfn (ac-macro? fn))) (cond (macfn (ac-mac-call macfn args env)) ((and (pair? fn) (eqv? (car fn) 'fn)) `(,afn ,@(map (lambda (x) (ac x env)) args))) ((= (length args) 0) `(ar-funcall0 ,afn ,@(map (lambda (x) (ac x env)) args))) ((= (length args) 1) `(ar-funcall1 ,afn ,@(map (lambda (x) (ac x env)) args))) ((= (length args) 2) `(ar-funcall2 , afn ,@(map (lambda (x) (ac x env)) args))) ((= (length args) 3) `(ar-funcall3 ,afn ,@(map (lambda (x) (ac x env)) args))) ((= (length args) 4) `(ar-funcall4 ,afn ,@(map (lambda (x) (ac x env)) args))) (#t `(ar-apply ,afn (list ,@(map (lambda (x) (ac x env)) args)))))))
(define (ac-call fn args env) (let ((macfn (ac-macro? fn))) (if macfn (ac-mac-call macfn args env) (let ((afn (ac fn env)) (aargs (map (lambda (x) (ac x env)) args)) (nargs (length args))) (cond ((and (pair? fn) (eqv? (car fn) 'fn)) `(,afn ,@aargs)) ((and (>= nargs 0) (<= nargs 4)) `(,(string->symbol (string-append "ar-funcall" (number->string nargs))) ,afn ,@aargs)) (#t `(ar-apply ,afn (list ,@aargs))))))))
-----