From 55a9ceb549911e598be213bdb755272e0f9c4a5c Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Tue, 23 Aug 2022 19:24:26 -0700 Subject: Change argument passing to use lists. Using vectors is just horribly complicated combined with builtins like apply, or procedures that take a rest parameter. Now we pass all arguments in a list. Hopefully optimization can undo this for known functions in the future. --- lib/csc/macros.csc | 32 ++++++-------------------------- 1 file changed, 6 insertions(+), 26 deletions(-) (limited to 'lib/csc/macros.csc') diff --git a/lib/csc/macros.csc b/lib/csc/macros.csc index 6278142..cf4549f 100644 --- a/lib/csc/macros.csc +++ b/lib/csc/macros.csc @@ -666,18 +666,6 @@ (_ (raise-syntax-error "unexpected form in let-syntax" (clean-syntax x))))))) - (define (split-args-rest formals) - (syntax-case formals - ('() - (values '() #f)) - ((var . vars) when (identifier? var) - (let-values (((args rest) (split-args-rest vars))) - (values (cons (identifier-name var) args) rest))) - (var when (identifier? var) - (values '() (identifier-name var))) - (_ (raise-syntax-error "unexpected form in split-args-rest" (clean-syntax formals))))) - - (define (expand-lambda-body-rest body env) (let loop ((body body) (expanded-body (make-constant #f))) @@ -731,20 +719,12 @@ (make-macro-transformer (lambda (x env) (syntax-case x - ((_ formals . body) - (let-values (((args rest) (split-args-rest formals))) - (define refs (map (lambda (name) - (make-lexical-ref name (gensym))) - args)) - (loop for ref in refs - do (set! env (add-binding (lexical-ref-name ref) ref env))) - (make-lambda - refs - (if rest - (make-lexical-ref rest (gensym)) - #f) - (expand-lambda-body body env)))) - (_ (raise-syntax-error "unexpected form in lambda" x)))))) + ((_ args . body) when (identifier? args) + (define ref (make-lexical-ref (identifier-name args) (gensym))) + (set! env (add-binding args ref env)) + (make-lambda + ref + (expand-lambda-body body env))))))) (define builtin-define -- cgit v1.3.1