~ chicken-r7rs (master) d53abe8763a18284d85df9e766bf0d033ac517e8
commit d53abe8763a18284d85df9e766bf0d033ac517e8 Author: Evan Hanson <evhan@foldling.org> AuthorDate: Sun Jun 8 19:15:18 2014 +0000 Commit: Evan Hanson <evhan@foldling.org> CommitDate: Sun Jun 8 19:15:18 2014 +0000 Bug fixes, type fixes, include expansion, vector-fill!, support code reorganization diff --git a/NOTES.org b/NOTES.org index 100b899..2896f5b 100644 --- a/NOTES.org +++ b/NOTES.org @@ -15,10 +15,6 @@ NOTES * Should bytevectors be implemented over blobs instead of srfi-4 (or something else)? -* I think library forms (i.e. ".sld" files) should look for includes relative to themselves - - this seems to be the standard amongst other Schemes that support R7RS-style libs - - not sure how to get that info when expanding define-library - * get-environment-variable: "It is also an error to mutate the resulting string" ... - can we just ignore this? diff --git a/r7rs-compile-time-module.scm b/r7rs-compile-time-module.scm index 5f004d3..5751c66 100644 --- a/r7rs-compile-time-module.scm +++ b/r7rs-compile-time-module.scm @@ -1,16 +1,8 @@ -(module r7rs-compile-time (parse-library-definition - define-extended-arity-comparator - process-cond-expand - fixup-import/export-spec - parse-library-name - wrap-er-macro-transformer - import-transformer - read-forms - register-r7rs-module - locate-library) - -(import scheme chicken) - -(include "r7rs-compile-time.scm") - -) +(module r7rs-compile-time (r7rs-cond-expand + r7rs-define-library + r7rs-import + r7rs-import-for-syntax + r7rs-include + r7rs-include-ci) + (import scheme chicken) + (include "r7rs-compile-time.scm")) diff --git a/r7rs-compile-time.scm b/r7rs-compile-time.scm index cc4eba4..2a3e022 100644 --- a/r7rs-compile-time.scm +++ b/r7rs-compile-time.scm @@ -2,33 +2,16 @@ (import matchable) -(use srfi-1 files extras data-structures) - -(define (parse-library-name name loc) - (define (fail) (syntax-error loc "invalid library name" name)) - (match name - ((? symbol?) name) - ;; We must replicate the core magic that handles SRFI-55's - ;; (require-extension (srfi N)), because we also need to generate - ;; SRFI-N library names when defining SRFIs from an R7RS module. - (('srfi (and num (? fixnum?))) - (string->symbol (string-append "srfi-" (number->string num)))) - ((parts ...) - (string->symbol - (string-intersperse - (map (lambda (part) - (cond ((symbol? part) (symbol->string part)) - ((number? part) (number->string part)) - (else (fail)))) - parts) - "."))) - (_ (fail)))) +(use srfi-1 files extras) +(use r7rs-library r7rs-support) (define (locate-library name loc) ; must be stripped ;;XXX scan include-path? (let* ((name2 (parse-library-name name loc)) (sname2 (symbol->string name2))) - (or (##sys#provided? name2) + (or (##sys#find-module name2 #f) + (memq name2 ##sys#core-library-modules) + (memq name2 ##sys#core-syntax-modules) (file-exists? (string-append sname2 ".import.so")) (file-exists? (string-append sname2 ".import.scm")) (extension-information name2)))) @@ -60,15 +43,6 @@ (loop more))) (else (fail "invalid \"cond-expand\" form"))))) -(define (fixup-import/export-spec spec loc) ; expects spec to be stripped - (match spec - (((and head (or 'only 'except 'rename 'prefix)) name . more) - (cons* head (fixup-import/export-spec name loc) more)) - ((name ...) - (parse-library-name name loc)) - ((? symbol? spec) spec) - (_ (syntax-error loc "invalid import/export specifier" spec)))) - ;; Dig e.g. foo.bar out of (only (foo bar) ...) ... (define (import/export-spec-feature-name spec loc) (match spec @@ -80,13 +54,6 @@ (else (syntax-error loc "invalid import/export specifier" spec)))) -(define (wrap-er-macro-transformer name handler) - (er-macro-transformer - (let ((orig (caddr (assq name (##sys#macro-environment))))) - (lambda (x r c) - (let ((e (##sys#current-environment))) - (handler x r c (lambda (x*) (orig x* '() e)))))))) - (define (import-transformer type) (wrap-er-macro-transformer type @@ -101,9 +68,25 @@ `(##core#require-extension (,name) #f)))) (strip-syntax (cdr x))))))) +(define (current-source-directory) + (cond (##sys#current-source-filename => pathname-directory) + (else #f))) + +(define (expand-toplevel-r7rs-library-forms exps) + (parameterize ((##sys#macro-environment (r7rs-library-macro-environment))) + (map (cut expand <> '()) exps))) + (define (read-forms filename ci?) - (parameterize ((case-sensitive (not ci?))) - (##sys#include-forms-from-file filename))) + (let ((path (##sys#resolve-include-filename filename #t))) + (fluid-let ((##sys#include-pathnames + (cond ((pathname-directory path) => + (cut cons <> ##sys#include-pathnames)) + ((current-source-directory) => + (cut cons <> ##sys#include-pathnames)) + (else ##sys#include-pathnames)))) + (expand-toplevel-r7rs-library-forms + (parameterize ((case-sensitive (not ci?))) + (##sys#include-forms-from-file path)))))) (define (parse-library-definition form dummy-export) ; expects stripped syntax (match form @@ -179,7 +162,7 @@ (_ (syntax-error 'define-library "invalid library definition" form)))) (define (register-r7rs-module name) - (let ((dummy (string->symbol (conc "\x04r7rs" name)))) + (let ((dummy (string->symbol (string-append "\x04r7rs" (symbol->string name))))) (put! name '##r7rs#module dummy) dummy)) @@ -196,15 +179,46 @@ (set-cdr! dummylist (cons sym (cdr dummylist)))))))) (register-export sym mod)))))) -(define-syntax define-extended-arity-comparator - (syntax-rules () - ((_ name comparator check-type) - (define name - (let ((c comparator)) - (lambda (o1 o2 . os) - (check-type o1 'name) - (let lp ((o1 o1) (o2 o2) (os os) (eq #t)) - (check-type o2 'name) - (if (null? os) - (and eq (c o1 o2)) - (lp o2 (car os) (cdr os) (and eq (c o1 o2))))))))))) +(define r7rs-define-library + (er-macro-transformer + (lambda (x r c) + (match (strip-syntax x) + ((_ name decls ...) + (let ((dummy (register-r7rs-module (parse-library-name name 'define-library)))) + (parse-library-definition x dummy))) + (else + (syntax-error 'define-library "invalid library definition" x)))))) + +(define r7rs-cond-expand + (er-macro-transformer + (lambda (x r c) + (cons (r 'begin) + (process-cond-expand (cdr x)))))) + +(define r7rs-include + (er-macro-transformer + (lambda (e r c) + (cons (r 'begin) + (append-map (cut read-forms <> #f) (cdr e)))))) + +(define r7rs-include-ci + (er-macro-transformer + (lambda (e r c) + (cons (r 'begin) + (append-map (cut read-forms <> #t) (cdr e)))))) + +(define r7rs-import + (import-transformer 'import)) + +(define r7rs-import-for-syntax + (import-transformer 'import-for-syntax)) + +(define (r7rs-library-macro-environment) + (filter (lambda (p) + (memv (caddr p) + (map (cut ##sys#slot <> 1) + (list r7rs-cond-expand + r7rs-define-library + r7rs-include + r7rs-include-ci)))) + (##sys#macro-environment))) diff --git a/r7rs-library.scm b/r7rs-library.scm new file mode 100644 index 0000000..9d2cb5a --- /dev/null +++ b/r7rs-library.scm @@ -0,0 +1,41 @@ +;;; +;;; Helpers for working with R7RS library import forms. +;;; +;;; These are used by r7rs-compile-time during library expansion +;;; and scheme.eval for (environment ...) module renaming. +;;; + +(module r7rs-library * + + (import scheme chicken matchable) + (use (only data-structures string-intersperse)) + + (define (fixup-import/export-spec spec loc) + (match spec + (((and head (or 'only 'except 'rename 'prefix)) name . more) + (cons head (cons (fixup-import/export-spec name loc) more))) + ((name ...) + (parse-library-name name loc)) + ((? symbol? spec) spec) + (else + (syntax-error loc "invalid import/export specifier" spec)))) + + (define (parse-library-name name loc) + (define (fail) (syntax-error loc "invalid library name" name)) + (match name + ((? symbol?) name) + ;; We must replicate the core magic that handles SRFI-55's + ;; (require-extension (srfi N)), because we also need to generate + ;; SRFI-N library names when defining SRFIs from an R7RS module. + (('srfi (and num (? fixnum?))) + (string->symbol (string-append "srfi-" (number->string num)))) + ((parts ...) + (string->symbol + (string-intersperse + (map (lambda (part) + (cond ((symbol? part) (symbol->string part)) + ((number? part) (number->string part)) + (else (fail)))) + parts) + "."))) + (else (fail))))) diff --git a/r7rs-support.scm b/r7rs-support.scm new file mode 100644 index 0000000..abefc0d --- /dev/null +++ b/r7rs-support.scm @@ -0,0 +1,27 @@ +;;; +;;; Support code for building the R7RS extension. +;;; + +(module r7rs-support * + + (import scheme chicken) + + (define (wrap-er-macro-transformer name handler) + (er-macro-transformer + (let ((orig (caddr (assq name (##sys#macro-environment))))) + (lambda (x r c) + (let ((e (##sys#current-environment))) + (handler x r c (lambda (x*) (orig x* '() e)))))))) + + (define-syntax define-extended-arity-comparator + (syntax-rules () + ((_ name comparator check-type) + (define name + (let ((c comparator)) + (lambda (o1 o2 . os) + (check-type o1 'name) + (let lp ((o1 o1) (o2 o2) (os os) (eq #t)) + (check-type o2 'name) + (if (null? os) + (and eq (c o1 o2)) + (lp o2 (car os) (cdr os) (and eq (c o1 o2)))))))))))) diff --git a/r7rs.scm b/r7rs.scm index 7615d70..e892c8b 100644 --- a/r7rs.scm +++ b/r7rs.scm @@ -1,11 +1,13 @@ (module r7rs (define-library import import-for-syntax export syntax-rules) (import (except scheme syntax-rules)) ;XXX except ... - (import (only chicken feature? include)) ;XXX except ... + (import (only chicken feature? include register-feature!)) ;; For syntax definition helpers. - (import-for-syntax r7rs-compile-time matchable) - (begin-for-syntax (require-library r7rs-compile-time)) + (import-for-syntax matchable) + (import-for-syntax r7rs-compile-time) + (begin-for-syntax + (require-library r7rs-compile-time)) ;; For extended number literals. (if (feature? 'compiler-extension) @@ -52,8 +54,8 @@ ;;; 5.2. Import declarations ;;; -(define-syntax import (import-transformer 'import)) -(define-syntax import-for-syntax (import-transformer 'import-for-syntax)) +(define-syntax import r7rs-import) +(define-syntax import-for-syntax r7rs-import-for-syntax) ;;; ;;; 5.4. Syntax definitions @@ -64,11 +66,10 @@ ;;; 5.6.1. Libraries ;;; -(define-syntax define-library - (er-macro-transformer - (lambda (x r c) - (match (strip-syntax x) - ((_ name decls ...) - (let ((dummy (register-r7rs-module (parse-library-name name 'define-library)))) - (parse-library-definition x dummy))) - (_ (syntax-error 'define-library "invalid library definition" x))))))) +(define-syntax define-library r7rs-define-library) + +;;; +;;; Appendix B. Standard feature identifiers +;;; + +(register-feature! #:r7rs)) diff --git a/r7rs.setup b/r7rs.setup index cb489c5..8e42ef6 100644 --- a/r7rs.setup +++ b/r7rs.setup @@ -6,10 +6,18 @@ (define scheme-modules '("case-lambda" "char" "complex" "cxr" "eval" "file" "inexact" "lazy" "load" "process-context" "r5rs" "read" "repl" "time" "write")) -(make (("r7rs-compile-time.so" ("r7rs-compile-time.scm" "r7rs-compile-time-module.scm") +(make (("r7rs-support.so" ("r7rs-support.scm") + (compile -s -O3 -d1 r7rs-support.scm -J) + (compile -s -O3 -d0 r7rs-support.import.scm)) + ("r7rs-library.so" ("r7rs-library.scm") + (compile -s -O3 -d1 r7rs-library.scm -J) + (compile -s -O3 -d0 r7rs-library.import.scm)) + ("r7rs-compile-time.so" + ("r7rs-compile-time.scm" "r7rs-compile-time-module.scm" "r7rs-library.so" "r7rs-support.so") (compile -s -O3 -d1 r7rs-compile-time-module.scm -J -o r7rs-compile-time.so) (compile -s -O3 -d0 r7rs-compile-time.import.scm)) - ("scheme.base.so" ("scheme.base.scm" "scheme.base-interface.scm") + ("scheme.base.so" + ("scheme.base.scm" "scheme.base-interface.scm" "r7rs-support.so") (compile -s -O3 -d1 scheme.base.scm -J -emit-type-file scheme.base.types) (compile -s -O3 -d0 scheme.base.import.scm))) '("r7rs-compile-time.so" "scheme.base.so")) @@ -33,6 +41,8 @@ (install-extension 'r7rs `("r7rs.so" "r7rs.import.so" + "r7rs-support.so" "r7rs-support.import.so" + "r7rs-library.so" "r7rs-library.import.so" "r7rs-compile-time.so" "r7rs-compile-time.import.so" "scheme.base.so" "scheme.base.import.so" "scheme.base.types" ,@(append-map diff --git a/scheme.base-interface.scm b/scheme.base-interface.scm index 0dd0025..ec85dc0 100644 --- a/scheme.base-interface.scm +++ b/scheme.base-interface.scm @@ -35,7 +35,7 @@ define define-record-type define-syntax - define-values + define-values ; TODO denominator numerator do dynamic-wind @@ -155,6 +155,7 @@ vector vector-append vector-copy vector-copy! + vector-fill! vector-for-each vector-length vector-map diff --git a/scheme.base.scm b/scheme.base.scm index f87b183..0d26dec 100644 --- a/scheme.base.scm +++ b/scheme.base.scm @@ -1,16 +1,20 @@ (module scheme.base () -(import (except chicken with-exception-handler include - quotient remainder modulo vector-copy!)) +(import (rename (except chicken modulo quotient remainder + vector-copy! + with-exception-handler) + (features feature-keywords))) + (import (except scheme syntax-rules cond-expand assoc list-set! list-tail member char=? char<? char>? char<=? char>=? string=? string<? string>? string<=? string>=? - string-copy string->list vector->list)) + string-copy string->list vector->list vector-fill!)) + (import (prefix (only scheme char=? char<? char>? char<=? char>=? string=? string<? string>? string<=? string>=?) %)) -(import (rename (only chicken include) (include %include))) + (import (rename (only srfi-4 make-u8vector subu8vector u8vector u8vector? u8vector-length u8vector-ref u8vector-set! read-u8vector read-u8vector! write-u8vector) @@ -22,12 +26,14 @@ (make-u8vector make-bytevector) (write-u8vector write-bytevector))) -(%include "scheme.base-interface.scm") +(include "scheme.base-interface.scm") ;; For syntax definition helpers. -(begin-for-syntax (require-library r7rs-compile-time)) +(import-for-syntax r7rs-support) (import-for-syntax r7rs-compile-time) -(import r7rs-compile-time) +(begin-for-syntax + (require-library r7rs-compile-time)) +(import r7rs-support) (import numbers) ;; read/write-string/line/byte @@ -57,28 +63,14 @@ ;;; 4.1.7. Inclusion ;;; -(define-syntax include - (er-macro-transformer - (lambda (e r c) - (cons (r 'begin) - (append-map (cut read-forms <> #f) (cdr e)))))) - -(define-syntax include-ci - (er-macro-transformer - (lambda (e r c) - (cons (r 'begin) - (append-map (cut read-forms <> #t) (cdr e)))))) +(define-syntax include r7rs-include) +(define-syntax include-ci r7rs-include-ci) ;;; ;;; 4.2.1. Conditionals ;;; -(define-syntax cond-expand - (er-macro-transformer - (lambda (x r c) - (cons (r 'begin) - (process-cond-expand (cdr x)))))) - +(define-syntax cond-expand r7rs-cond-expand) ;;; ;;; 4.2.7. Exception handling @@ -267,16 +259,18 @@ (else (lp (cdr lst)))))))) -(: list-copy (forall (a) ((list-of a) -> (list-of a)))) +(: list-copy (forall (a) (a -> a))) ;; TODO: Test if this is the quickest way to do this, or whether we ;; should just cons recursively like our SRFI-1 implementation does. (define (list-copy lst) - (let lp ((res '()) - (lst lst)) - (if (null? lst) - (##sys#fast-reverse res) - (lp (cons (car lst) res) (cdr lst))))) + (cond ((pair? lst) + (let lp ((res '()) + (lst lst)) + (if (pair? lst) + (lp (cons (car lst) res) (cdr lst)) + (append (##sys#fast-reverse res) lst)))) + (else lst))) ;;; ;;; 6.5 Symbols @@ -364,6 +358,7 @@ (: vector-append (#!rest vector -> vector)) (: vector-copy (forall (a) ((vector-of a) #!optional fixnum fixnum -> (vector-of a)))) (: vector-copy! (vector fixnum vector #!optional fixnum fixnum -> undefined)) +(: vector-fill! (vector * #!optional fixnum fixnum -> undefined)) (: vector->list (forall (a) ((vector-of a) #!optional fixnum fixnum -> (list-of a)))) (define vector-copy @@ -403,6 +398,21 @@ ((to at from start) (copy! to at from start)) ((to at from start end) (copy! to at from start end))))) +(define vector-fill! + (let ((fill! (lambda (v f start . end) + (##sys#check-vector v 'vector-fill!) + (let* ((len (##sys#size v)) + (end (optional end len))) + (##sys#check-range start 0 (fx+ end 1) 'vector-fill!) + (##sys#check-range end start (fx+ len 1) 'vector-fill!) + (do ((i start (fx+ i 1))) + ((fx= i end)) + (##sys#setslot v i f)))))) + (case-lambda + ((v f) (fill! v f 0)) + ((v f start) (fill! v f start)) + ((v f start end) (fill! v f start end))))) + (define vector->list (let ((v->l (lambda (v start . end) (##sys#check-vector v 'vector->list) @@ -504,7 +514,7 @@ (let ((s (##sys#make-string (fx- end start)))) (do ((si 0 (fx+ si 1)) (vi start (fx+ vi 1))) - ((fx= si end) s) + ((fx= vi end) s) (##sys#setbyte s si (bytevector-u8-ref bv vi)))))))) (case-lambda ((bv) (bv->s bv 0)) @@ -521,7 +531,7 @@ (let ((bv (make-bytevector (fx- end start)))) (do ((vi 0 (fx+ vi 1)) (si start (fx+ si 1))) - ((fx= vi end) bv) + ((fx= si end) bv) (bytevector-u8-set! bv vi (##sys#byte s si)))))))) (case-lambda ((s) (s->bv s 0)) @@ -532,10 +542,10 @@ ;;; 6.10. Control features ;;; -(: string-for-each ((char -> *) string #!rest string -> void)) -(: string-map ((char -> char) string #!rest string -> string)) -(: vector-for-each ((* -> *) vector #!rest vector -> void)) -(: vector-map ((* -> *) vector #!rest vector -> vector)) +(: string-for-each ((char #!rest char -> *) string #!rest string -> void)) +(: string-map ((char #!rest char -> char) string #!rest string -> string)) +(: vector-for-each ((* #!rest * -> *) vector #!rest vector -> void)) +(: vector-map ((* #!rest * -> *) vector #!rest vector -> vector)) (define string-map (case-lambda @@ -651,7 +661,7 @@ (lambda () ((cadr exception-handlers) obj)))))) -(: error-object? (* --> boolean : (struct condition))) +(: error-object? (* -> boolean : (struct condition))) (: error-object-message ((struct condition) -> string)) (: error-object-irritants ((struct condition) -> list)) @@ -696,7 +706,7 @@ (: read-u8 (#!optional input-port -> fixnum)) (: textual-port? (* --> boolean : port?)) (: u8-ready? (#!optional input-port -> boolean)) -(: write-string (string #!optional input-port fixnum fixnum -> void)) +(: write-string (string #!optional output-port fixnum fixnum -> void)) (: write-u8 (fixnum #!optional output-port -> void)) ;; CHICKEN's ports can handle both. @@ -828,4 +838,13 @@ (define (get-output-bytevector p) (string->utf8 (get-output-string p))) -) +;;; +;;; 6.14. System interface +;;; + +(: features (--> (list-of symbol))) + +(define (features) + (map (lambda (s) + (##sys#string->symbol (##sys#symbol->string s))) + (feature-keywords)))) diff --git a/scheme.char.scm b/scheme.char.scm index e9e9e70..261bc6a 100644 --- a/scheme.char.scm +++ b/scheme.char.scm @@ -7,6 +7,8 @@ string-upcase string-downcase digit-value) +(import chicken) +(import r7rs-support) (import (except scheme char-ci=? char-ci<? char-ci>? char-ci<=? char-ci>=? @@ -20,9 +22,6 @@ (require-library srfi-13) (import (only srfi-13 string-map string-upcase string-downcase)) -(import chicken) -(require-extension r7rs-compile-time) - (: char-ci=? (char char #!rest char -> boolean)) (: char-ci<? (char char #!rest char -> boolean)) (: char-ci>? (char char #!rest char -> boolean)) diff --git a/scheme.eval.scm b/scheme.eval.scm index f753d12..4727c01 100644 --- a/scheme.eval.scm +++ b/scheme.eval.scm @@ -2,7 +2,7 @@ environment) (import (rename scheme (eval %eval)) chicken) - (import r7rs-compile-time) + (use r7rs-library) ;;; ;;; 6.12. Environments and evaluation @@ -12,7 +12,7 @@ (define (eval expr env) (%eval expr env)) - (: environment (list -> (struct environment))) + (: environment (#!rest list -> (struct environment))) (define (environment . specs) (let ((name (gensym "environment-module-"))) @@ -29,7 +29,7 @@ specs))) (let ((mod (##sys#find-module name))) (##sys#make-structure 'environment - name + (cons 'import specs) (let ((env (##sys#slot mod 13))) (append (car env) (cdr env))) ; combine env and syntax bindings #t))) diff --git a/scheme.process-context.scm b/scheme.process-context.scm index 22dabe2..c09eef2 100644 --- a/scheme.process-context.scm +++ b/scheme.process-context.scm @@ -5,7 +5,7 @@ get-environment-variables) (import scheme - (rename chicken (exit chicken:exit)) + (rename chicken (exit chicken-exit)) foreign) ;;; @@ -56,9 +56,8 @@ extern char **environ; (define exit (case-lambda (() - (chicken:exit 0)) + (exit 0)) ((obj) - (##sys#cleanup-before-exit) ;; ##sys#dynamic-unwind is hidden, have to unwind manually. ; (##sys#dynamic-unwind '() (length ##sys#dynamic-winds)) (let unwind () @@ -67,7 +66,8 @@ extern char **environ; (set! ##sys#dynamic-winds (cdr ##sys#dynamic-winds)) (after) (unwind)))) - (##core#inline "C_exit_runtime" (->exit-status obj))))) + ;; The built-in exit runs cleanup handlers for us. + (chicken-exit (->exit-status obj))))) (define emergency-exit (case-lambda diff --git a/scheme.r5rs.scm b/scheme.r5rs.scm index d5b8d8b..1e664ea 100644 --- a/scheme.r5rs.scm +++ b/scheme.r5rs.scm @@ -15,11 +15,12 @@ (reexport (except scheme null-environment scheme-report-environment eval - and begin begin-for-syntax case cond cond-expand define - define-syntax delay delay-force do else export if lambda let - let* let-syntax letrec letrec* letrec-syntax module or - quasiquote quote reexport require-extension - require-extension-for-syntax require-library set! syntax)) + and begin begin-for-syntax case cond cond-expand + define define-syntax delay delay-force do export if + import import-for-syntax lambda let let* let-syntax + letrec letrec* letrec-syntax module or quasiquote quote + reexport require-extension require-extension-for-syntax + require-library set! syntax syntax-rules)) (define-constant null-environment-identifiers '(and begin case cond cond-expand define define-syntax delay diff --git a/synrules.scm b/synrules.scm index f8cf331..3654038 100644 --- a/synrules.scm +++ b/synrules.scm @@ -128,7 +128,7 @@ 0 ellipsis? (meta-variables pattern 0 ellipsis? '() #f))))) - (%syntax-error "ill-formed syntax rule" rule))) + (##sys#syntax-error "ill-formed syntax rule" rule))) ;; Generate code to test whether input expression matches pattern @@ -209,12 +209,13 @@ (if probe (if (<= (cdr probe) dim) template - (%syntax-error "template dimension error (too few ellipses?)" - template)) + (##sys#syntax-error-hook + "template dimension error (too few ellipses?)" + template)) `(,%rename (##core#syntax ,template))))) ((ellipsis-escaped-pattern? template el?) (if (or (not (pair? (cdr template))) (pair? (cddr template))) - (%syntax-error "Invalid escaped ellipsis template" template) + (##sys#syntax-error-hook "Invalid escaped ellipsis template" template) (process-template (cadr template) dim (lambda _ #f) env))) ((segment-template? template el?) (let* ((depth (segment-depth template el?)) @@ -222,7 +223,7 @@ (vars (free-meta-variables (car template) seg-dim el? env '()))) (if (null? vars) - (%syntax-error "too many ellipses" template) + (##sys#syntax-error-hook "too many ellipses" template) (let* ((x (process-template (car template) seg-dim el? env)) (gen (if (and (pair? vars) (null? (cdr vars)) @@ -295,9 +296,9 @@ (and (segment-template? p el?) (cond (seen-segment? - (%syntax-error "Only one segment per level is allowed" p)) + (##sys#syntax-error-hook "Only one segment per level is allowed" p)) ((not (list? p)) ; Improper list - (%syntax-error "Cannot combine dotted tail and ellipsis" p)) + (##sys#syntax-error-hook "Cannot combine dotted tail and ellipsis" p)) (else #t)))) (define (segment-template? pattern el?)Trap