~ chicken-core (chicken-5) df84dd4eee4d3cd54c6c07e9dd4a0e01c0d81d9a
commit df84dd4eee4d3cd54c6c07e9dd4a0e01c0d81d9a Author: felix <felix@call-with-current-continuation.org> AuthorDate: Wed Mar 17 14:26:59 2010 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Wed Mar 24 07:38:16 2010 +0100 use internal forms for builtin syntax diff --git a/chicken-ffi-syntax.scm b/chicken-ffi-syntax.scm index 7c33e446..25474b98 100644 --- a/chicken-ffi-syntax.scm +++ b/chicken-ffi-syntax.scm @@ -34,7 +34,6 @@ (##sys#er-transformer (lambda (form r c) (let* ((form (cdr form)) - (%quote (r 'quote)) (quals (and (pair? form) (string? (car form)))) (var (and (not quals) (pair? form) (symbol? (car form)))) ) (cond [var @@ -99,9 +98,8 @@ (##sys#check-syntax 'let-location form '(_ #((variable _ . #(_ 0 1)) 0) . _)) (let* ((bindings (cadr form)) (body (cddr form)) - (%let (r 'let)) [aliases (map (lambda (_) (r (gensym))) bindings)]) - `(,%let ,(append-map + `(##core#let ,(append-map (lambda (b a) (if (pair? (cddr b)) (list (cons a (cddr b))) @@ -119,7 +117,7 @@ ,(car b) ,(cadr b) ,rest) ) ) - `(,%let () ,@body) + `(##core#let () ,@body) bindings aliases) ) ) ) ) ) @@ -132,7 +130,7 @@ (lambda (form r c) (##sys#check-syntax 'foreign-code form '(_ . #(string 0))) (let ([tmp (gensym 'code_)]) - `(,(r 'begin) + `(##core#begin (,(r 'declare) (foreign-declare ,(sprintf "static C_word ~A() { ~A\n; return C_SCHEME_UNDEFINED; }\n" @@ -148,7 +146,7 @@ (##sys#check-syntax 'foreign-value form '(_ _ _)) (let ((tmp (gensym 'code_)) (code (cadr form))) - `(,(r 'begin) + `(##core#begin (##core#define-foreign-variable ,tmp ,(caddr form) ,(cond ((string? code) code) diff --git a/chicken-syntax.scm b/chicken-syntax.scm index 8a12bb92..127e92f1 100644 --- a/chicken-syntax.scm +++ b/chicken-syntax.scm @@ -28,10 +28,13 @@ (declare (unit chicken-syntax) (disable-interrupts) - (no-bound-checks) - (no-procedure-checks) (fixnum) ) +#+(not debugbuild) +(declare + (no-bound-checks) + (no-procedure-checks)) + (##sys#provide 'chicken-more-macros ; historical, remove later 'chicken-syntax) @@ -93,40 +96,43 @@ `(##core#begin (,%define ,setr - (##core#lambda (x val) - (##core#check (##sys#check-structure x (##core#quote ,name))) - (##sys#block-set! x ,i val) ) ) + (##core#lambda + (x val) + (##core#check (##sys#check-structure x (##core#quote ,name))) + (##sys#block-set! x ,i val) ) ) (,%define ,getr ,(if setters `(,%getter-with-setter - (##core#lambda (x) - (##core#check (##sys#check-structure x (##core#quote ,name))) - (##sys#block-ref x ,i) ) + (##core#lambda + (x) + (##core#check (##sys#check-structure x (##core#quote ,name))) + (##sys#block-ref x ,i) ) ,setr) - `(##core#lambda (x) - (##core#check (##sys#check-structure x (##core#quote ,name))) - (##sys#block-ref x ,i) ) ) ) ) + `(##core#lambda + (x) + (##core#check (##sys#check-structure x (##core#quote ,name))) + (##sys#block-ref x ,i) ) ) ) ) (mapslots (##sys#slot slots 1) (fx+ i 1)) ) ) ) ) ) ) ) ) ) (##sys#extend-macro-environment 'receive '() (##sys#er-transformer - (lambda (form r c) - (##sys#check-syntax 'receive form '(_ _ . #(_ 0))) - (cond ((null? (cddr form)) - `(##sys#call-with-values (##core#lambda () ,@(cdr form)) ##sys#list) ) - (else - (##sys#check-syntax 'receive form '(_ lambda-list _ . #(_ 1))) - (let ((vars (cadr form)) - (exp (caddr form)) - (rest (cdddr form))) - (if (and (pair? vars) (null? (cdr vars))) - `(##core#let ((,(car vars) ,exp)) ,@rest) - `(##sys#call-with-values - (##core#lambda () ,exp) - (##core#lambda ,vars ,@rest)) ) ) ) ) ))) + (lambda (form r c) + (##sys#check-syntax 'receive form '(_ _ . #(_ 0))) + (cond ((null? (cddr form)) + `(##sys#call-with-values (##core#lambda () ,@(cdr form)) ##sys#list) ) + (else + (##sys#check-syntax 'receive form '(_ lambda-list _ . #(_ 1))) + (let ((vars (cadr form)) + (exp (caddr form)) + (rest (cdddr form))) + (if (and (pair? vars) (null? (cdr vars))) + `(##core#let ((,(car vars) ,exp)) ,@rest) + `(##sys#call-with-values + (##core#lambda () ,exp) + (##core#lambda ,vars ,@rest)) ) ) ) ) ))) (##sys#extend-macro-environment 'time '() @@ -165,12 +171,12 @@ `(##core#immutable '"assertion failed") (car msg-and-args) ) ) ) `(##core#if (##core#check ,exp) - (##core#undefined) - (##sys#error - ,msg - ,@(if (fx> (length msg-and-args) 1) - (cdr msg-and-args) - `((##core#quote ,(##sys#strip-syntax exp)))))))))) + (##core#undefined) + (##sys#error + ,msg + ,@(if (fx> (length msg-and-args) 1) + (cdr msg-and-args) + `((##core#quote ,(##sys#strip-syntax exp)))))))))) (##sys#extend-macro-environment 'ensure @@ -182,15 +188,16 @@ (exp (caddr form)) (args (cdddr form)) (tmp (r 'tmp))) - `(##core#let ([,tmp ,exp]) - (##core#if (##core#check (,pred ,tmp)) - ,tmp - (##sys#signal-hook - #:type-error - ,@(if (pair? args) - args - `((##core#immutable '"argument has incorrect type") - ,tmp ',pred) ) ) ) ) ) ) ) ) + `(##core#let + ([,tmp ,exp]) + (##core#if (##core#check (,pred ,tmp)) + ,tmp + (##sys#signal-hook + #:type-error + ,@(if (pair? args) + args + `((##core#immutable '"argument has incorrect type") + ,tmp ',pred) ) ) ) ) ) ) ) ) (##sys#extend-macro-environment 'fluid-let '() @@ -202,26 +209,27 @@ (ids (##sys#map car clauses)) (new-tmps (##sys#map (lambda (x) (r (gensym))) clauses)) (old-tmps (##sys#map (lambda (x) (r (gensym))) clauses))) - `(##core#let (,@(map ##sys#list new-tmps (##sys#map cadr clauses)) - ,@(map ##sys#list old-tmps - (let loop ((n (length clauses))) - (if (eq? n 0) - '() - (cons #f (loop (fx- n 1))) ) ) ) ) - (##sys#dynamic-wind - (##core#lambda () - ,@(map (lambda (ot id) `(##core#set! ,ot ,id)) - old-tmps ids) - ,@(map (lambda (id nt) `(##core#set! ,id ,nt)) - ids new-tmps) - (##core#undefined) ) - (##core#lambda () ,@body) - (##core#lambda () - ,@(map (lambda (nt id) `(##core#set! ,nt ,id)) - new-tmps ids) - ,@(map (lambda (id ot) `(##core#set! ,id ,ot)) - ids old-tmps) - (##core#undefined) ) ) ) ) ))) + `(##core#let + (,@(map ##sys#list new-tmps (##sys#map cadr clauses)) + ,@(map ##sys#list old-tmps + (let loop ((n (length clauses))) + (if (eq? n 0) + '() + (cons #f (loop (fx- n 1))) ) ) ) ) + (##sys#dynamic-wind + (##core#lambda () + ,@(map (lambda (ot id) `(##core#set! ,ot ,id)) + old-tmps ids) + ,@(map (lambda (id nt) `(##core#set! ,id ,nt)) + ids new-tmps) + (##core#undefined) ) + (##core#lambda () ,@body) + (##core#lambda () + ,@(map (lambda (nt id) `(##core#set! ,nt ,id)) + new-tmps ids) + ,@(map (lambda (id ot) `(##core#set! ,id ,ot)) + ids old-tmps) + (##core#undefined) ) ) ) ) ))) (##sys#extend-macro-environment 'eval-when '() @@ -265,33 +273,38 @@ [vals (##sys#map cadr bindings)] [aliases (##sys#map (lambda (z) (r (gensym))) params)] [aliases2 (##sys#map (lambda (z) (r (gensym))) params)] ) - `(##core#let ,(##sys#append (map ##sys#list aliases params) (map ##sys#list aliases2 vals)) - (##core#let ((,swap (##core#lambda () - ,@(map (lambda (a a2) - `(##core#let ((t (,a))) (,a ,a2) - (##core#set! ,a2 t))) - aliases aliases2) ) ) ) - (##sys#dynamic-wind - ,swap - (##core#lambda () ,@body) - ,swap) ) ) ) ))) + `(##core#let + ,(##sys#append + (map ##sys#list aliases params) + (map ##sys#list aliases2 vals)) + (##core#let + ((,swap (##core#lambda + () + ,@(map (lambda (a a2) + `(##core#let ((t (,a))) (,a ,a2) + (##core#set! ,a2 t))) + aliases aliases2) ) ) ) + (##sys#dynamic-wind + ,swap + (##core#lambda () ,@body) + ,swap) ) ) ) ))) (##sys#extend-macro-environment 'when '() (##sys#er-transformer (lambda (form r c) (##sys#check-syntax 'when form '#(_ 2)) - `(,(r 'if) ,(cadr form) - (,(r 'begin) ,@(cddr form)))))) + `(##core#if ,(cadr form) + (##core#begin ,@(cddr form)))))) (##sys#extend-macro-environment 'unless '() (##sys#er-transformer (lambda (form r c) (##sys#check-syntax 'unless form '#(_ 2)) - `(,(r 'if) ,(cadr form) - (##core#undefined) - (,(r 'begin) ,@(cddr form)))))) + `(##core#if ,(cadr form) + (##core#undefined) + (##core#begin ,@(cddr form)))))) (##sys#extend-macro-environment 'set!-values '() @@ -364,14 +377,19 @@ [exps (map (lambda (x) (cadr x)) vbindings)] [llists2 llists2] ) (cond ((null? llists) - `(##core#let ,(map (lambda (v) (##sys#list v (lookup v))) vars) ,@body) ) + `(##core#let + ,(map (lambda (v) (##sys#list v (lookup v))) vars) + ,@body) ) ((and (pair? (car llists2)) (null? (cdar llists2))) - `(##core#let ((,(caar llists2) ,(car exps))) - ,(fold (cdr llists) (cdr exps) (cdr llists2)) ) ) + `(##core#let + ((,(caar llists2) ,(car exps))) + ,(fold (cdr llists) (cdr exps) (cdr llists2)) ) ) (else `(##sys#call-with-values (##core#lambda () ,(car exps)) - (##core#lambda ,(car llists2) ,(fold (cdr llists) (cdr exps) (cdr llists2))) ) ) ) ) ) ) ) ) ) ) + (##core#lambda + ,(car llists2) + ,(fold (cdr llists) (cdr exps) (cdr llists2))) ) ) ) ) ) ) ) ) ) ) (##sys#extend-macro-environment 'let*-values '() @@ -397,15 +415,15 @@ (let* ([vars (apply ##sys#append (map (lambda (x) (car x)) vbindings))] [aliases (map (lambda (v) (cons v (r (gensym v)))) vars)] [lookup (lambda (v) (cdr (assq v aliases)))] ) - `(##core#let ,(map (lambda (v) (##sys#list v '(##core#undefined))) vars) - ,@(map (lambda (vb) - `(##sys#call-with-values - (##core#lambda () ,(cadr vb)) - (##core#lambda ,(map lookup (car vb)) - ,@(map (lambda (v) - `(##core#set! ,v ,(lookup v))) (car vb)) ) ) ) - vbindings) - ,@body) ) ) ) ) ) + `(##core#let + ,(map (lambda (v) (##sys#list v '(##core#undefined))) vars) + ,@(map (lambda (vb) + `(##sys#call-with-values + (##core#lambda () ,(cadr vb)) + (##core#lambda ,(map lookup (car vb)) + ,@(map (lambda (v) `(##core#set! ,v ,(lookup v))) (car vb)) ) ) ) + vbindings) + ,@body) ) ) ) ) ) (##sys#extend-macro-environment 'nth-value @@ -422,22 +440,22 @@ 'define-inline '() (##sys#er-transformer (lambda (form r c) - (letrec ([quotify-proc - (lambda (xs id) - (##sys#check-syntax id xs '#(_ 1)) - (let* ([head (car xs)] - [name (if (pair? head) (car head) head)] - [val (if (pair? head) - `(##core#lambda ,(cdr head) ,@(cdr xs)) - (cadr xs) ) ] ) - (when (or (not (pair? val)) - (and (not (eq? '##core#lambda (car val))) - (not (c (r 'lambda) (car val))))) - (syntax-error - 'define-inline "invalid substitution form - must be lambda" - name val) ) - (list name val) ) ) ] ) - `(##core#define-inline ,@(quotify-proc (cdr form) 'define-inline)))) ) ) + (letrec ([quotify-proc + (lambda (xs id) + (##sys#check-syntax id xs '#(_ 1)) + (let* ([head (car xs)] + [name (if (pair? head) (car head) head)] + [val (if (pair? head) + `(##core#lambda ,(cdr head) ,@(cdr xs)) + (cadr xs) ) ] ) + (when (or (not (pair? val)) + (and (not (eq? '##core#lambda (car val))) + (not (c (r 'lambda) (car val))))) + (syntax-error + 'define-inline "invalid substitution form - must be lambda" + name val) ) + (list name val) ) ) ] ) + `(##core#define-inline ,@(quotify-proc (cdr form) 'define-inline)))) ) ) (##sys#extend-macro-environment 'and-let* '() @@ -468,7 +486,8 @@ (tmp (r 'tmp)) (%else (r 'else)) (%or (r 'or))) - `(##core#let ((,tmp ,exp)) + `(##core#let + ((,tmp ,exp)) ,(let expand ((clauses body)) (if (not (pair? clauses)) '(##core#undefined) @@ -658,9 +677,8 @@ (##sys#er-transformer (lambda (form r c) (##sys#check-syntax 'optional form '(_ _ . #(_ 0 1))) - (let ((var (r 'tmp)) - (%if (r 'if))) - `(,(r 'let) ((,var ,(cadr form))) + (let ((var (r 'tmp))) + `(##core#let ((,var ,(cadr form))) (##core#if (,(r 'null?) ,var) ,(optional (cddr form) #f) (##core#if (##core#check (,(r 'null?) (,(r 'cdr) ,var))) @@ -698,25 +716,26 @@ (%car (r 'car)) (%cdr (r 'cdr))) (let ((rvar (r 'tmp))) - `(##core#let ((,rvar ,args)) - ,(let loop ([args rvar] [vardefs var/defs]) - (if (null? vardefs) - `(##core#if (##core#check (##core#null? ,args)) - (##core#let () ,@body) - (##sys#error - (##core#immutable '"too many optional arguments") - ,args) ) - (let ([head (car vardefs)]) - (if (pair? head) - (let ((rvar2 (r 'tmp2))) - `(##core#let ((,(car head) (##core#if (##core#null? ,args) - ,(cadr head) - (,%car ,args))) - (,rvar2 (##core#if (,%null? ,args) - '() - (,%cdr ,args))) ) - ,(loop rvar2 (cdr vardefs)) ) ) - `(##core#let ((,head ,args)) ,@body) ) ) ) ) ) ) )))) + `(##core#let + ((,rvar ,args)) + ,(let loop ([args rvar] [vardefs var/defs]) + (if (null? vardefs) + `(##core#if (##core#check (,%null? ,args)) + (##core#let () ,@body) + (##sys#error + (##core#immutable '"too many optional arguments") + ,args) ) + (let ([head (car vardefs)]) + (if (pair? head) + (let ((rvar2 (r 'tmp2))) + `(##core#let ((,(car head) (##core#if (,%null? ,args) + ,(cadr head) + (,%car ,args))) + (,rvar2 (##core#if (,%null? ,args) + '() + (,%cdr ,args))) ) + ,(loop rvar2 (cdr vardefs)) ) ) + `(##core#let ((,head ,args)) ,@body) ) ) ) ) ) ) )))) ;;; case-lambda (SRFI-16): @@ -748,40 +767,42 @@ (%eq? (r 'eq?)) (%car (r 'car)) (%cdr (r 'cdr))) - `(##core#lambda ,(append minvars rvar) - (##core#let ((,lvar (length ,rvar))) - ,(fold-right - (lambda (c body) - (##sys#decompose-lambda-list - (car c) - (lambda (vars argc rest) - (##sys#check-syntax 'case-lambda (car c) 'lambda-list) - `(##core#if ,(let ([a2 (fx- argc mincount)]) - (if rest - (if (zero? a2) - #t - `(,%>= ,lvar ,a2) ) - `(,%eq? ,lvar ,a2) ) ) - ,(receive (vars1 vars2) - (split-at! (take vars argc) mincount) - (let ((bindings - (let build ((vars2 vars2) (vrest rvar)) - (if (null? vars2) - (cond (rest `(##core#let ((,rest ,vrest)) ,@(cdr c))) - ((null? (cddr c)) (cadr c)) - (else `(##core#let () ,@(cdr c))) ) - (let ((vrest2 (r (gensym)))) - `(##core#let ((,(car vars2) (,%car ,vrest)) - (,vrest2 (,%cdr ,vrest)) ) - ,(if (pair? (cdr vars2)) - (build (cdr vars2) vrest2) - (build '() vrest2) ) ) ) ) ) ) ) - (if (null? vars1) - bindings - `(##core#let ,(map list vars1 minvars) ,bindings) ) ) ) - ,body) ) ) ) - '(##core#check (##sys#error (##core#immutable '"no matching clause in call to 'case-lambda' form"))) - (cdr form)))))))) + `(##core#lambda + ,(append minvars rvar) + (##core#let + ((,lvar (length ,rvar))) + ,(fold-right + (lambda (c body) + (##sys#decompose-lambda-list + (car c) + (lambda (vars argc rest) + (##sys#check-syntax 'case-lambda (car c) 'lambda-list) + `(##core#if ,(let ([a2 (fx- argc mincount)]) + (if rest + (if (zero? a2) + #t + `(,%>= ,lvar ,a2) ) + `(,%eq? ,lvar ,a2) ) ) + ,(receive (vars1 vars2) + (split-at! (take vars argc) mincount) + (let ((bindings + (let build ((vars2 vars2) (vrest rvar)) + (if (null? vars2) + (cond (rest `(##core#let ((,rest ,vrest)) ,@(cdr c))) + ((null? (cddr c)) (cadr c)) + (else `(##core#let () ,@(cdr c))) ) + (let ((vrest2 (r (gensym)))) + `(##core#let ((,(car vars2) (,%car ,vrest)) + (,vrest2 (,%cdr ,vrest)) ) + ,(if (pair? (cdr vars2)) + (build (cdr vars2) vrest2) + (build '() vrest2) ) ) ) ) ) ) ) + (if (null? vars1) + bindings + `(##core#let ,(map list vars1 minvars) ,bindings) ) ) ) + ,body) ) ) ) + '(##core#check (##sys#error (##core#immutable '"no matching clause in call to 'case-lambda' form"))) + (cdr form)))))))) ;;; Record printing: @@ -814,13 +835,15 @@ (##sys#er-transformer (lambda (form r c) (##sys#check-syntax 'handle-exceptions form '(_ variable _ . _)) - (let ((k (r 'k)) - (args (r 'args))) - `((,(r 'call-with-current-continuation) - (##core#lambda (,k) - (,(r 'with-exception-handler) - (##core#lambda (,(cadr form)) (,k (##core#lambda () ,(caddr form)))) - (##core#lambda () + (let ((k (r 'k)) + (args (r 'args))) + `((,(r 'call-with-current-continuation) + (##core#lambda + (,k) + (,(r 'with-exception-handler) + (##core#lambda (,(cadr form)) (,k (##core#lambda () ,(caddr form)))) + (##core#lambda + () (##sys#call-with-values (##core#lambda () ,@(cdddr form)) (##core#lambda @@ -854,9 +877,9 @@ `(##core#let () ,@body) ) ) ) ) ) `(,(r 'handle-exceptions) ,exvar (##core#let ([,kvar (,%and (##sys#structure? ,exvar (##core#quote condition) ) - (##sys#slot ,exvar 1))]) - (,(r 'cond) ,@(map parse-clause (cddr form)) - (,%else (##sys#signal ,exvar)) ) ) + (##sys#slot ,exvar 1))]) + (,(r 'cond) ,@(map parse-clause (cddr form)) + (,%else (##sys#signal ,exvar)) ) ) ,(cadr form)))))) @@ -872,16 +895,15 @@ form '(_ variable #(variable 1) variable . _)) (let* ((t (cadr form)) - (conser (caddr form)) - (pred (cadddr form)) - (slots (cddddr form)) - (%define (r 'define)) - (%quote (r 'quote)) - (%getter-with-setter (r 'getter-with-setter)) - (vars (cdr conser)) - (x (r 'x)) - (y (r 'y)) - (slotnames (map car slots))) + (conser (caddr form)) + (pred (cadddr form)) + (slots (cddddr form)) + (%define (r 'define)) + (%getter-with-setter (r 'getter-with-setter)) + (vars (cdr conser)) + (x (r 'x)) + (y (r 'y)) + (slotnames (map car slots))) `(##core#begin (,%define ,conser (##sys#make-structure @@ -902,22 +924,22 @@ (pair? (cdr setr)) (c 'setter (car setr)) (cadr setr))) - (get `(,%lambda + (get `(##core#lambda (,x) (##core#check (##sys#check-structure ,x - (,%quote ,t) - (,%quote ,(cadr slot)))) + (##core#quote ,t) + (##core#quote ,(cadr slot)))) (##sys#block-ref ,x ,i) ) ) (set (and settable - `(,%lambda + `(##core#lambda (,x ,y) (##core#check (##sys#check-structure ,x - (,%quote ,t) - (,%quote ,ssetter))) + (##core#quote ,t) + (##core#quote ,ssetter))) (##sys#block-set! ,x ,i ,y)) ))) `((,%define ,(cadr slot) @@ -950,8 +972,9 @@ [rvals (reverse vals)] ) (if rest (let ([rv (r (gensym))]) - `(##core#lambda (,@rvars . ,rv) - (,%apply ,(car rvals) ,@(cdr rvals) ,rv) ) ) + `(##core#lambda + (,@rvars . ,rv) + (,%apply ,(car rvals) ,@(cdr rvals) ,rv) ) ) `(##core#lambda ,rvars ((##core#begin ,(car rvals)) ,@(cdr rvals)) ) ) ) (cond ((c %<> (car xs)) (let ([v (r (gensym))])Trap