~ chicken-core (chicken-5) 1f2722cd053d23292fca29508e7fb23187652dfa
commit 1f2722cd053d23292fca29508e7fb23187652dfa Author: felix <felix@call-with-current-continuation.org> AuthorDate: Sat Mar 13 13:45:16 2010 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Wed Mar 24 07:28:22 2010 +0100 various syntax bugfixes diff --git a/chicken-ffi-syntax.scm b/chicken-ffi-syntax.scm index ad925223..7c33e446 100644 --- a/chicken-ffi-syntax.scm +++ b/chicken-ffi-syntax.scm @@ -70,7 +70,7 @@ 'location '() (##sys#er-transformer - (lambda (form r c) + (lambda (x r c) (##sys#check-syntax 'location x '(location _)) `(##core#location ,(cadr x))))) diff --git a/chicken.scm b/chicken.scm index 167e2284..55eadbd8 100644 --- a/chicken.scm +++ b/chicken.scm @@ -35,7 +35,7 @@ (include "compiler-namespace") (include "tweaks") -(eval-when (load) +(eval-when (load) (include "chicken-ffi-syntax") ) diff --git a/compiler-namespace.scm b/compiler-namespace.scm index d3c26717..ceedc546 100644 --- a/compiler-namespace.scm +++ b/compiler-namespace.scm @@ -194,8 +194,7 @@ load-type-database local-definitions location-pointer-map - loop-lambda-names - make-argument-list + make-argument-list make-block-variable-literal make-random-name make-variable-list diff --git a/compiler.scm b/compiler.scm index 1550493c..09ad645f 100644 --- a/compiler.scm +++ b/compiler.scm @@ -99,19 +99,18 @@ ; (##core#declare {<spec>}) ; (##core#immutable <exp>) ; (##core#global-ref <variable>) -; (quote <exp>) -; ([##core#]syntax <exp>) +; (##core#quote <exp>) +; (##core#syntax <exp>) ; (##core#if <exp> <exp> [<exp>]) -; ([##core#]let <variable> ({(<variable> <exp>)}) <body>) -; ([##core#]let ({(<variable> <exp>)}) <body>) -; ([##core#]letrec ({(<variable> <exp>)}) <body>) +; (##core#let <variable> ({(<variable> <exp>)}) <body>) +; (##core#let ({(<variable> <exp>)}) <body>) +; (##core#letrec ({(<variable> <exp>)}) <body>) ; (##core#let-location <symbol> <type> [<init>] <exp>) -; ([##core#]lambda <variable> <body>) -; ([##core#]lambda ({<variable>}+ [. <variable>]) <body>) -; ([##core#]set! <variable> <exp>) +; (##core#lambda <variable> <body>) +; (##core#lambda ({<variable>}+ [. <variable>]) <body>) +; (##core#set! <variable> <exp>) ; (##core#begin <exp> ...) ; (##core#include <string>) -; (##core#named-lambda <name> <llist> <body>) ; (##core#loop-lambda <llist> <body>) ; (##core#undefined) ; (##core#primitive <name>) @@ -140,12 +139,11 @@ ; (##core#require-for-syntax <exp> ...) ; (##core#require-extension (<id> ...) <bool>) ; (##core#app <exp> {<exp>}) -; ([##core#]syntax <exp>) -; (<exp> {<exp>}) ; (##core#define-syntax <symbol> <expr>) ; (##core#define-compiler-syntax <symbol> <expr>) ; (##core#let-compiler-syntax ((<symbol> <expr>) ...) <expr> ...) ; (##core#module <symbol> #t | (<name> | (<name> ...) ...) <body>) +; (<exp> {<exp>}) ; - Core language: ; @@ -367,7 +365,6 @@ (define foreign-lambda-stubs '()) (define foreign-callback-stubs '()) (define external-variables '()) -(define loop-lambda-names '()) (define profile-lambda-list '()) (define profile-lambda-index 0) (define profile-info-vector-name #f) @@ -550,7 +547,7 @@ '(##core#undefined) (walk (cadddr x) e se #f) ) ) ) - ((##core#syntax) + ((##core#syntax ##core#quote) `(quote ,(##sys#strip-syntax (cadr x)))) ((##core#check) @@ -638,8 +635,7 @@ (##core#let () ,@body) ) e se dest))) - ((lambda ##core#lambda) ;XXX qualify `lambda', but: (*) - (##sys#check-syntax 'lambda x '(_ lambda-list . #(_ 1)) #f se) + ((lambda ##core#lambda) (let ((llist (cadr x)) (obody (cddr x)) ) (when (##sys#extended-lambda-list? llist) @@ -825,7 +821,8 @@ (##sys#strip-syntax (caddr x))))) (csyntax compiler-syntax)) (when (##sys#current-module) - (##sys#syntax-error-hook 'module "modules may not be nested" name)) + (##sys#syntax-error-hook + 'module "modules may not be nested" name)) (let-values (((body mreg) (parameterize ((##sys#current-module (##sys#register-module name exports) ) @@ -894,10 +891,7 @@ (set! compiler-syntax csyntax) body)))) - ((##core#named-lambda) - (walk `(##core#lambda ,@(cddr x)) e se (cadr x)) ) - - ((##core#loop-lambda) + ((##core#loop-lambda) ;XXX is this really needed? (let* ([vars (cadr x)] [obody (cddr x)] [aliases (map gensym vars)] @@ -1262,8 +1256,7 @@ ,(begin (set! extended-bindings (append internal-bindings extended-bindings)) exp) ) - '() (##sys#current-environment) - #f) ) ) + '() (##sys#current-environment) #f) ) ) (define (process-declaration spec se) ; se unused in the moment diff --git a/eval.scm b/eval.scm index 0633b20e..5581ccff 100644 --- a/eval.scm +++ b/eval.scm @@ -689,9 +689,6 @@ [(##core#loop-lambda) (compile `(,(rename 'lambda se) ,@(cdr x)) e #f tf cntr se) ] - [(##core#named-lambda) - (compile `(,(rename 'lambda se) ,@(cddr x)) e (cadr x) tf cntr se) ] - [(##core#require-for-syntax) (let ([ids (map (lambda (x) (eval/meta x)) @@ -745,7 +742,7 @@ [(##core#app) (compile-call (cdr x) e tf cntr se) ] - [else (compile-call x e tf cntr se)] ) ] ) ) ] + [else (compile-call x e tf cntr se)] ) ) ) ) ] [else (emit-syntax-trace-info tf x cntr) @@ -821,8 +818,8 @@ (##sys#check-structure env 'environment) (set! e (##sys#slot env 1)) (set! mut (##sys#slot env 2)) ) ) ) - ((fluid-let ([##sys#environment-is-mutable mut] - [##sys#eval-environment e] ) + ((fluid-let ((##sys#environment-is-mutable mut) + (##sys#eval-environment e) ) (##sys#compile-to-closure x '() (##sys#current-environment)) ) '() ) ) ) ) ) diff --git a/expand.scm b/expand.scm index 19487840..11d87ce9 100644 --- a/expand.scm +++ b/expand.scm @@ -249,7 +249,9 @@ (values `(##core#app (##core#letrec - ([,bindings (##core#loop-lambda ,(map (lambda (b) (car b)) bs) ,@(cddr body))]) + ([,bindings + (##core#loop-lambda + ,(map (lambda (b) (car b)) bs) ,@(cddr body))]) ,bindings) ,@(##sys#map cadr bs) ) #t) ) ] @@ -1035,15 +1037,17 @@ 'let '() (##sys#er-transformer - (lambda (form r c) - (##sys#check-syntax 'let x '(_ #((symbol _) 0) . #(_ 1))) + (lambda (x r c) + (if (and (pair? (cdr x)) (symbol? (cadr x))) + (##sys#check-syntax 'let x '(_ symbol #((symbol _) 0) . #(_ 1))) + (##sys#check-syntax 'let x '(_ #((symbol _) 0) . #(_ 1)))) `(##core#let ,@(cdr x))))) (##sys#extend-macro-environment 'letrec '() (##sys#er-transformer - (lambda (form r c) + (lambda (x r c) (##sys#check-syntax 'letrec x '(_ #((symbol _) 0) . #(_ 1))) `(##core#letrec ,@(cdr x))))) @@ -1051,7 +1055,7 @@ 'let-syntax '() (##sys#er-transformer - (lambda (form r c) + (lambda (x r c) (##sys#check-syntax 'let-syntax x '(_ #((symbol _) 0) . #(_ 1))) `(##core#let-syntax ,@(cdr x))))) @@ -1059,7 +1063,7 @@ 'letrec-syntax '() (##sys#er-transformer - (lambda (form r c) + (lambda (x r c) (##sys#check-syntax 'letrec-syntax x '(_ #((symbol _) 0) . #(_ 1))) `(##core#letrec-syntax ,@(cdr x))))) @@ -1067,7 +1071,7 @@ 'set! '() (##sys#er-transformer - (lambda (form r c) + (lambda (x r c) (##sys#check-syntax 'set! x '(_ _ _)) (let ((dest (cadr x)) (val (caddr x))) @@ -1124,10 +1128,10 @@ ((null? (cdr clause)) `(,%or ,(car clause) ,(expand rclauses))) ((c %=> (cadr clause)) (let ((tmp (r 'tmp))) - `(,%let ((,tmp ,(car clause))) - (,%if ,tmp - (,(caddr clause) ,tmp) - ,(expand rclauses) ) ) ) ) + `(##core#let ((,tmp ,(car clause))) + (##core#if ,tmp + (,(caddr clause) ,tmp) + ,(expand rclauses) ) ) ) ) ((and (list? clause) (fx= (length clause) 4) (c %=> (caddr clause))) (let ((tmp (r 'tmp))) @@ -1232,7 +1236,7 @@ (let ((hx (car tail))) (if (eq? n 0) hx - (list '##sys#list `(,%quote ,%unquote) + (list '##sys#list `(##core#quote ,%unquote) (walk hx (fx- n 1)) ) ) ) `(##core#quote ,%unquote) ) ) ((c %quasiquote head) diff --git a/tests/compiler-tests.scm b/tests/compiler-tests.scm index 23bcf601..65ebcb89 100644 --- a/tests/compiler-tests.scm +++ b/tests/compiler-tests.scm @@ -1,6 +1,9 @@ ;;;; compiler-tests.scm +(import foreign) + + ;; test dropping of previous toplevel assignments (define (foo) (define (bar) 1) (bar 2)) ; will trigger error later @@ -26,17 +29,16 @@ ; - canonicalization of assignment to location didn't walk expansion recursively (define test-location - (let-location - ((again bool #f)) - (lambda () - ((foreign-lambda* - int - (((c-pointer bool) again)) - "*again=1; return(1);") - (location again)) - again))) + (let-location ((again bool #f)) + (lambda () + ((foreign-lambda* + int + (((c-pointer bool) again)) + "*again=1; return(1);") + (location again)) + again))) -(print (test-location)) +(assert (test-location)) ;;; rev. 12188 (reported by Jörg Wittenberger) @@ -49,17 +51,18 @@ (import scheme chicken foreign) (define (bar n) - (let-location - ((off integer 0)) - (lambda () ((foreign-lambda* - void - (((c-pointer integer) i)) - "(*i)++;") - (location off)) off))) + (let-location ((off integer 0)) + (lambda () + ((foreign-lambda* + void + (((c-pointer integer) i)) + "(*i)++;") + (location off)) + off))) ) (import x) -(bar 42) +(assert (= 1 ((bar 42)))) ;;; rev. 14574 (reported by Peter Bex) ; diff --git a/tests/runtests.sh b/tests/runtests.sh index ba915f24..1e41afb9 100644 --- a/tests/runtests.sh +++ b/tests/runtests.sh @@ -121,6 +121,18 @@ $interpret matchable.scm -s match-test.scm echo "======================================== syntax tests (loopy-loop) ..." $interpret -s loopy-test.scm +echo "======================================== r4rstest ..." +echo "(expect mult-float-print-test to fail)" +$interpret -e '(set! ##sys#procedure->string (constantly "#<procedure>"))' \ + -i -s r4rstest.scm >r4rstest.log + +if test -n "$MSYSTEM"; then + # the windows runtime library prints flonums differently + tail r4rstest.log +else + diff -bu r4rstest.out r4rstest.log || true +fi + echo "======================================== syntax tests (r5rs_pitfalls) ..." echo "(expect two failures)" $interpret -i -s r5rs_pitfalls.scm @@ -181,18 +193,6 @@ echo "======================================== regular expression tests ..." $interpret -bnq test-irregex.scm $interpret -bnq test-glob.scm -echo "======================================== r4rstest ..." -echo "(expect mult-float-print-test to fail)" -$interpret -e '(set! ##sys#procedure->string (constantly "#<procedure>"))' \ - -i -s r4rstest.scm >r4rstest.log - -if test -n "$MSYSTEM"; then - # the windows runtime library prints flonums differently - tail r4rstest.log -else - diff -bu r4rstest.out r4rstest.log || true -fi - echo "======================================== compiler/nursery stress test ..." for s in 100000 120000 200000 250000 300000 350000 400000 450000 500000; do echo " $s" diff --git a/tests/syntax-tests.scm b/tests/syntax-tests.scm index fb4b9a39..19097481 100644 --- a/tests/syntax-tests.scm +++ b/tests/syntax-tests.scm @@ -403,3 +403,33 @@ (let-syntax ((s1 (syntax-rules () ((_ x) x)))) (assert (equal? '#((99)) (s2 99)))) + +;;; local definitions + +(define-syntax s2 + (syntax-rules () + ((_) 1))) + +(define (f1) 3) +(define v1 9) +(define v2 10) + +(let () + (define-syntax s2 + (syntax-rules () + ((_) 2))) + 42 + (define-values (v1 v2) (values 1 2)) + 43 + (define (f1) 4) + (define ((f2)) 4) + (assert (= 4 (f1))) + (assert (= 4 ((f2)))) + (assert (= 2 (s2))) + (assert (= 1 v1)) + (assert (= 2 v2))) + +(assert (= 1 (s2))) +(assert (= 3 (f1))) +(assert (= 9 v1)) +(assert (= 10 v2))Trap