~ chicken-core (chicken-5) 14f7eb30207e801072e26bcd818180496dc397d4
commit 14f7eb30207e801072e26bcd818180496dc397d4 Author: Evan Hanson <evhan@foldling.org> AuthorDate: Wed Jul 8 21:14:44 2015 +1200 Commit: Evan Hanson <evhan@foldling.org> CommitDate: Wed Jul 8 21:14:44 2015 +1200 Convert the expand unit into a module diff --git a/batch-driver.scm b/batch-driver.scm index a4ab276b..82351f9d 100644 --- a/batch-driver.scm +++ b/batch-driver.scm @@ -178,7 +178,8 @@ arg) ) ) ) (initialize-compiler) (set! explicit-use-flag (memq 'explicit-use options)) - (let ((initforms `((import scheme chicken) + (let ((initforms `((import-for-syntax scheme chicken) + (import scheme chicken) (##core#declare ,@(append default-declarations diff --git a/chicken-syntax.scm b/chicken-syntax.scm index eaba3ab2..2063d8cc 100644 --- a/chicken-syntax.scm +++ b/chicken-syntax.scm @@ -27,6 +27,7 @@ (declare (unit chicken-syntax) + (uses expand) (disable-interrupts) (fixnum) ) @@ -78,7 +79,7 @@ (null? (cddr slot))) (cadr slot)) (else - (syntax-error + (chicken.expand#syntax-error 'define-record "invalid slot specification" slot)))) slots))) `(##core#begin @@ -180,7 +181,7 @@ (msg (optional msg-and-args "assertion failed")) (tmp (r 'tmp))) (when (string? msg) - (and-let* ((ln (get-line-number form))) + (and-let* ((ln (chicken.expand#get-line-number form))) (set! msg (string-append "(" ln ") " msg)))) `(##core#let ((,tmp ,exp)) (##core#if (##core#check ,tmp) @@ -460,7 +461,7 @@ (when (or (not (pair? val)) (and (not (eq? '##core#lambda (car val))) (not (c (r 'lambda) (car val))))) - (syntax-error + (chicken.expand#syntax-error 'define-inline "invalid substitution form - must be lambda" name val) ) (list name val) ) ) ] ) @@ -502,7 +503,7 @@ (cond ((null? clauses) '(##core#undefined) ) ((not (pair? clauses)) - (syntax-error 'select "invalid syntax" clauses)) + (chicken.expand#syntax-error 'select "invalid syntax" clauses)) (else (let ((clause (##sys#slot clauses 0)) (rclauses (##sys#slot clauses 1)) ) @@ -979,7 +980,7 @@ (%<...> (r '<...>)) (%apply (r 'apply))) (when (null? (cdr form)) - (syntax-error 'cut "you need to supply at least a procedure" form)) + (chicken.expand#syntax-error 'cut "you need to supply at least a procedure" form)) (let loop ([xs (cdr form)] [vars '()] [vals '()] [rest #f]) (if (null? xs) (let ([rvars (reverse vars)] @@ -995,11 +996,12 @@ (let ([v (r (gensym))]) (loop (cdr xs) (cons v vars) (cons v vals) #f) ) ) ((c %<...> (car xs)) - (if (null? (cdr xs)) - (loop '() vars vals #t) - (syntax-error 'cut - "tail patterns after <...> are not supported" - form))) + (if (null? (cdr xs)) + (loop '() vars vals #t) + (chicken.expand#syntax-error + 'cut + "tail patterns after <...> are not supported" + form))) (else (loop (cdr xs) vars (cons (car xs) vals) #f)) ) ) ) ) ))) (##sys#extend-macro-environment @@ -1011,7 +1013,7 @@ (%<> (r '<>)) (%<...> (r '<...>))) (when (null? (cdr form)) - (syntax-error 'cute "you need to supply at least a procedure" form)) + (chicken.expand#syntax-error 'cute "you need to supply at least a procedure" form)) (let loop ([xs (cdr form)] [vars '()] [bs '()] [vals '()] [rest #f]) (if (null? xs) (let ([rvars (reverse vars)] @@ -1028,11 +1030,12 @@ (let ([v (r (gensym))]) (loop (cdr xs) (cons v vars) bs (cons v vals) #f) ) ) ((c %<...> (car xs)) - (if (null? (cdr xs)) - (loop '() vars bs vals #t) - (syntax-error 'cute - "tail patterns after <...> are not supported" - form))) + (if (null? (cdr xs)) + (loop '() vars bs vals #t) + (chicken.expand#syntax-error + 'cute + "tail patterns after <...> are not supported" + form))) (else (let ([v (r (gensym))]) (loop (cdr xs) @@ -1183,7 +1186,7 @@ type1 (##sys#strip-syntax name1)))) (cond ((not type) - (syntax-error ': "invalid type syntax" name1 type1)) + (chicken.expand#syntax-error ': "invalid type syntax" name1 type1)) (else `(##core#declare (type (,name1 ,type1 ,@(cdddr x))) @@ -1270,7 +1273,7 @@ (cadr arg) 'define-specialization) atypes))) - (else (syntax-error + (else (chicken.expand#syntax-error 'define-specialization "invalid argument syntax" arg head))))))))))))) @@ -1281,7 +1284,7 @@ (##sys#check-syntax 'compiler-typecase x '(_ _ . #((_ . #(_ 1)) 1))) (let ((val (memq #:compiling ##sys#features)) (var (gensym)) - (ln (get-line-number x))) + (ln (chicken.expand#get-line-number x))) `(##core#let ((,var ,(cadr x))) (##core#typecase ,ln diff --git a/chicken.import.scm b/chicken.import.scm index 7ecd469e..339e6fa5 100644 --- a/chicken.import.scm +++ b/chicken.import.scm @@ -71,7 +71,7 @@ (dynamic-load-libraries . chicken.eval#dynamic-load-libraries) enable-warnings equal=? - er-macro-transformer + (er-macro-transformer . chicken.expand#er-macro-transformer) errno error (eval-handler . chicken.eval#eval-handler) @@ -80,7 +80,7 @@ exact-integer-nth-root exit exit-handler - expand + (expand . chicken.expand#expand) (extension-information . chicken.eval#extension-information) feature? features @@ -165,13 +165,14 @@ get-condition-property get-environment-variable get-keyword + (get-line-number . chicken.expand#get-line-number) get-output-string get-properties getter-with-setter implicit-exit-handler infinite? integer-length - ir-macro-transformer + (ir-macro-transformer . chicken.expand#ir-macro-transformer) keyword->string keyword-style keyword? @@ -239,20 +240,18 @@ string->blob string->keyword string->uninterned-symbol - strip-syntax + (strip-syntax . chicken.expand#strip-syntax) sub1 subvector symbol-append symbol-escape symbol-plist - syntax-error + (syntax-error . chicken.expand#syntax-error) system unregister-feature! vector-resize vector-copy! void warning - er-macro-transformer - ir-macro-transformer with-exception-handler) ##sys#chicken-macro-environment) ;XXX incorrect - won't work in compiled executable that does expansion diff --git a/csi.scm b/csi.scm index 11743c5c..024550e7 100644 --- a/csi.scm +++ b/csi.scm @@ -26,7 +26,7 @@ (declare - (uses data-structures eval extras ports) + (uses data-structures eval expand extras ports) (usual-integrations) (disable-interrupts) (compile-syntax) @@ -1091,6 +1091,7 @@ EOF ;; Load the the default modules into the evaluation environment. ;; This is done before setting load-verbose => #t to avoid ;; spurious import messages. + (eval '(import-for-syntax scheme chicken)) (eval '(import scheme chicken)) (unless quiet (load-verbose #t) diff --git a/defaults.make b/defaults.make index 85bfd270..07e7549c 100644 --- a/defaults.make +++ b/defaults.make @@ -271,7 +271,7 @@ PRIMITIVE_IMPORT_LIBRARIES = chicken srfi-4 PRIMITIVE_IMPORT_LIBRARIES += csi setup-api setup-download POSIX_IMPORT_LIBRARY = posix FOREIGN_IMPORT_LIBRARY = foreign -DYNAMIC_IMPORT_LIBRARIES = data-structures eval extras files irregex lolevel ports tcp utils +DYNAMIC_IMPORT_LIBRARIES = data-structures eval expand extras files irregex lolevel ports tcp utils # targets diff --git a/distribution/manifest b/distribution/manifest index 58ed9135..ca5169f9 100644 --- a/distribution/manifest +++ b/distribution/manifest @@ -242,6 +242,8 @@ chicken.data-structures.import.scm chicken.data-structures.import.c chicken.eval.import.scm chicken.eval.import.c +chicken.expand.import.scm +chicken.expand.import.c chicken.extras.import.scm chicken.extras.import.c chicken.files.import.scm diff --git a/expand.scm b/expand.scm index d926151d..3eda4d89 100644 --- a/expand.scm +++ b/expand.scm @@ -31,14 +31,19 @@ (unit expand) (disable-interrupts) (fixnum) - (hide match-expression - macro-alias - check-for-multiple-bindings - d dd dm dx map-se - lookup check-for-redef) (not inline ##sys#syntax-error-hook ##sys#compiler-syntax-hook ##sys#toplevel-definition-hook)) +(module chicken.expand + (expand + get-line-number + strip-syntax + syntax-error + er-macro-transformer + ir-macro-transformer) + +(import scheme chicken) + (include "common-declarations.scm") (define-syntax d (syntax-rules () ((_ . _) (void)))) @@ -918,6 +923,7 @@ (define ##sys#er-transformer er-macro-transformer) (define ##sys#ir-transformer ir-macro-transformer) +) ; chicken.expand module ;;; Macro definitions: @@ -1173,7 +1179,7 @@ (##sys#srfi-4-vector? (car clause)) (and (pair? (car clause)) (c (r 'quote) (caar clause)))) - (expand rclauses (strip-syntax (car clause))) + (expand rclauses (chicken.expand#strip-syntax (car clause))) (cond ((and (fx= (length clause) 3) (c %=> (cadr clause))) `(,(caddr clause) ,(car clause))) @@ -1324,16 +1330,16 @@ (else `(##sys#cons ,(walk head n) ,(walk tail n)) ) ) ) ) ) ) (define (simplify x) - (cond ((match-expression x '(##sys#cons a (##core#quote ())) '(a)) + (cond ((chicken.expand#match-expression x '(##sys#cons a (##core#quote ())) '(a)) => (lambda (env) (simplify `(##sys#list ,(cdr (assq 'a env))))) ) - ((match-expression x '(##sys#cons a (##sys#list . b)) '(a b)) + ((chicken.expand#match-expression x '(##sys#cons a (##sys#list . b)) '(a b)) => (lambda (env) (let ((bxs (assq 'b env))) (if (fx< (length bxs) 32) (simplify `(##sys#list ,(cdr (assq 'a env)) ,@(cdr bxs) ) ) x) ) ) ) - ((match-expression x '(##sys#append a (##core#quote ())) '(a)) + ((chicken.expand#match-expression x '(##sys#append a (##core#quote ())) '(a)) => (lambda (env) (cdr (assq 'a env))) ) (else x) ) ) (##sys#check-syntax 'quasiquote form '(_ _)) diff --git a/modules.scm b/modules.scm index 241a88b0..d6989c27 100644 --- a/modules.scm +++ b/modules.scm @@ -26,7 +26,7 @@ (declare (unit modules) - (uses eval) + (uses eval expand) (disable-interrupts) (fixnum) (hide lookup merge-se module-indirect-exports) diff --git a/rules.make b/rules.make index 8425226c..613e981d 100644 --- a/rules.make +++ b/rules.make @@ -683,7 +683,7 @@ library.c: $(SRCDIR)library.scm $(SRCDIR)banner.scm $(SRCDIR)common-declarations eval.c: $(SRCDIR)eval.scm $(SRCDIR)common-declarations.scm $(SRCDIR)mini-srfi-1.scm $(bootstrap-lib) -emit-import-library chicken.eval expand.c: $(SRCDIR)expand.scm $(SRCDIR)synrules.scm $(SRCDIR)common-declarations.scm - $(bootstrap-lib) + $(bootstrap-lib) -emit-import-library chicken.expand modules.c: $(SRCDIR)modules.scm $(SRCDIR)common-declarations.scm $(SRCDIR)mini-srfi-1.scm $(bootstrap-lib) extras.c: $(SRCDIR)extras.scm $(SRCDIR)common-declarations.scm diff --git a/scrutinizer.scm b/scrutinizer.scm index dc5c2526..d1c6fb6a 100644 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -26,7 +26,7 @@ (declare (unit scrutinizer) - (uses data-structures eval extras ports files support)) + (uses data-structures eval expand extras ports files support)) (module chicken.compiler.scrutinizer (scrutinize load-type-database emit-type-file diff --git a/tests/scrutiny.expected b/tests/scrutiny.expected index 9c72dc76..3e5462ac 100644 --- a/tests/scrutiny.expected +++ b/tests/scrutiny.expected @@ -42,17 +42,17 @@ Warning: at toplevel: (scrutiny-tests.scm:29) in procedure call to `+', expected argument #2 of type `number', but was given an argument of type `symbol' Warning: at toplevel: - assignment of value of type `fixnum' to toplevel variable `car' does not match declared type `(forall (a183) (procedure car ((pair a183 *)) a183))' + assignment of value of type `fixnum' to toplevel variable `car' does not match declared type `(forall (a188) (procedure car ((pair a188 *)) a188))' Warning: at toplevel: - expected in `let' binding of `g15' a single result, but were given 2 results + expected in `let' binding of `g20' a single result, but were given 2 results Warning: at toplevel: - in procedure call to `g15', expected a value of type `(procedure () *)', but was given a value of type `fixnum' + in procedure call to `g20', expected a value of type `(procedure () *)', but was given a value of type `fixnum' Note: in toplevel procedure `foo': expected value of type boolean in conditional but were given a value of type - `(procedure bar37 () *)' which is always true: + `(procedure bar42 () *)' which is always true: (if bar 3 (##core#undefined)) diff --git a/types.db b/types.db index 979ebb63..67c05d22 100644 --- a/types.db +++ b/types.db @@ -976,9 +976,9 @@ ((* (or symbol char eof null undefined)) (eq? #(1) #(2))) ((number number) (= #(1) #(2)))) -(er-macro-transformer +(chicken.expand#er-macro-transformer (#(procedure #:clean #:enforce) - er-macro-transformer + chicken.expand#er-macro-transformer ((procedure (* (procedure (*) *) (procedure (* *) *)) *)) (struct transformer))) @@ -989,7 +989,7 @@ (executable-pathname (#(procedure #:pure) executable-pathname () (or string false))) (exit (procedure exit (#!optional fixnum) noreturn)) (exit-handler (#(procedure #:clean #:enforce) exit-handler (#!optional (procedure (fixnum) . *)) procedure)) -(expand (procedure expand (* #!optional list) *)) +(chicken.expand#expand (procedure chicken.expand#expand (* #!optional list) *)) (chicken.eval#extension-information (#(procedure #:clean) chicken.eval#extension-information (symbol) *)) (feature? (#(procedure #:clean) feature? (#!rest symbol) boolean)) (features (#(procedure #:clean) features () (list-of symbol))) @@ -1173,9 +1173,9 @@ (implicit-exit-handler (#(procedure #:clean #:enforce) implicit-exit-handler (#!optional (procedure () . *)) procedure)) -(ir-macro-transformer +(chicken.expand#ir-macro-transformer (#(procedure #:clean #:enforce) - ir-macro-transformer + chicken.expand#ir-macro-transformer ((procedure (* (procedure (*) *) (procedure (* *) *)) *)) (struct transformer))) @@ -1279,7 +1279,7 @@ (string->blob (#(procedure #:clean #:enforce) string->blob (string) blob)) (string->keyword (#(procedure #:clean #:enforce) string->keyword (string) symbol)) (string->uninterned-symbol (#(procedure #:clean #:enforce) string->uninterned-symbol (string) symbol)) -(strip-syntax (#(procedure #:clean) strip-syntax (*) *)) +(chicken.expand#strip-syntax (#(procedure #:clean) chicken.expand#strip-syntax (*) *)) (sub1 (#(procedure #:clean #:enforce #:foldable) sub1 (number) number) ((fixnum) (integer) @@ -1297,7 +1297,7 @@ (symbol-plist (#(procedure #:clean #:enforce) symbol-plist (symbol) list) ((symbol) (##sys#slot #(1) '2))) -(syntax-error (procedure syntax-error (* #!rest) noreturn)) +(chicken.expand#syntax-error (procedure chicken.expand#syntax-error (* #!rest) noreturn)) (system (#(procedure #:clean #:enforce) system (string) fixnum)) (unregister-feature! (#(procedure #:clean #:enforce) unregister-feature! (#!rest symbol) undefined)) (vector-resizeTrap