diff options
| author | Rose Hogenson <rhogenson@posteo.net> | 2022-08-23 19:24:26 -0700 |
|---|---|---|
| committer | Rose Hogenson <rhogenson@posteo.net> | 2022-08-23 19:24:26 -0700 |
| commit | 55a9ceb549911e598be213bdb755272e0f9c4a5c (patch) | |
| tree | b84c36f2449203f9d560cb09702af3393b82e652 /lib/csc/macros.csc | |
| parent | 9e3116423f15269e06b2dad558f07f400e02d210 (diff) | |
| download | chromatopelma-55a9ceb549911e598be213bdb755272e0f9c4a5c.tar.zst | |
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.
Diffstat (limited to 'lib/csc/macros.csc')
| -rw-r--r-- | lib/csc/macros.csc | 32 |
1 files changed, 6 insertions, 26 deletions
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 |
