From f5d870f23be2fcad9650e72dfa34eed90bc2da0a Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Mon, 5 Feb 2007 14:19:03 -0500 Subject: [PATCH] * made assembler accept integers (instead of fixnums) as immediates. --- src/ikarus.boot | Bin 2169622 -> 2169623 bytes src/libcogen1.ss | 510 +++++++++++++++++---------------------------- src/libintelasm.ss | 2 +- src/racompiler.ss | 153 ++++++++++++++ 4 files changed, 349 insertions(+), 316 deletions(-) create mode 100755 src/racompiler.ss diff --git a/src/ikarus.boot b/src/ikarus.boot index e5ad2f84b1539701d4d39f3e14f42e26ef75174a..b25c3ed320e88912d79578522d5a7911479b14d9 100644 GIT binary patch delta 69928 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 JFI(Q#{|8ZSXEsu6i(JjRP)G4|t!W8`!iz%h2 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 diff --git a/src/libcogen1.ss b/src/libcogen1.ss index f131232..37519ec 100644 --- a/src/libcogen1.ss +++ b/src/libcogen1.ss @@ -172,6 +172,7 @@ [(jmpcall label rator arg*) (make-jmpcall label (Expr rator) (map Expr arg*))] [(appcall rator arg*) + (error 'new-cogen "appcall not supported yet") (make-appcall (Expr rator) (map Expr arg*))] [(mvcall rator k) (make-mvcall (Expr rator) (Clambda k))] @@ -197,336 +198,214 @@ ;;; (Program x)) -;;; -;;; So, what do we want to do here? -;;; 1. we eliminate all variables: -;;; bind should become a sequence of (setfv i ) statements -;;; variable refs should befome (fv i) where i is the index of -;;; the var on the stack. -;;; 2. we need to keep track of the maximum stack size used; and -;;; whether we made a procedure call so that we can insert a -;;; stack overflow check with an appropriate size check. -;;; 3. as we generate code, we need to keep track of which stack -;;; locations contain pointers so that procedure calls can -;;; set an appropriate mask. -;;; 4. primitives that allocate, as well as closures and fixes -;;; should insert an appropriate alloc-check marks as well as -;;; keep the live masks for the later generation of trap handlers -;;; 5. primcalls should also keep track of liveness information -;;; and frame size just in case the primitive needs to make a -;;; procedure call. -(define-record move (src dst)) -(define-record alloc-check (n si live)) -(define-record fvar (idx)) -(define acr '%acr) -(define-record cpvar (idx)) -(define-record cmp (op v0 v1)) -(define false-object 'false-object) - -(define (new-cogen-pass1 x) +(define (eliminate-fix x) ;;; - (define who 'new-cogen-pass-1) + (define who 'eliminate-fix) ;;; - (define (fxeven? x) - (if (fixnum? x) - ($fxzero? ($fxlogand x 1)) - (error 'fxeven? "~s is not a fixnum" x))) - ;;; - (define (sum ls) - (let f ([ls ls] [n 0]) - (cond - [(null? ls) n] - [else (f (cdr ls) (fx+ (car ls) n))]))) - ;;; - (define fxmax - (case-lambda - [(x y) (if (fx> x y) x y)] - [(x y z) (fxmax x (fxmax y z))] - [_ (error 'fxmax "unhandled")])) - ;;; - (define (do-seq e0 si live env e1 k) - (let-values ([(e0 msi0 call0?) - (Effect e0 si live env)]) - (let-values ([(e1 msi1 call1?) - (k e1 si live env)]) - (values (make-seq e0 e1) - (fxmax msi0 msi1) - (or call0? call1?))))) - ;;; - (define (do-cond e0 si live env e1 e2 k) - (let-values ([(e0 msi0 call0?) - (Pred e0 si live env)]) - (let-values ([(e1 msi1 call1?) - (k e1 si live env)] - [(e2 msi2 call2?) - (k e2 si live env)]) - (values (make-conditional e0 e1 e2) - (fxmax msi0 msi1 msi2) - (or call0? call1? call2?))))) - ;;; - (define (do-move-to-mem loc expr si live env) - (record-case expr - [(constant) - (values (make-move expr loc) 0 #f)] - [else - (let-values ([(x msi call?) - (Value expr si live env)]) - (values (make-seq x (make-move acr loc)) msi call?))])) - ;;; - (define (do-bind lhs* rhs* si live env0 env body k) - (cond - [(null? lhs*) - (k body si live env)] - [else - (let ([fv (make-fvar si)]) - (let-values ([(e0 msi0 call0?) - (do-move-to-mem fv (car rhs*) si live env0)]) - (let-values ([(e1 msi1 call1?) - (do-bind (cdr lhs*) (cdr rhs*) - (fxadd1 si) - (cons si live) - env0 - (cons (cons (car lhs*) fv) env) - body - k)]) - (values (make-seq e0 e1) - (fxmax msi0 msi1) - (or call0? call1?)))))])) - ;;; - (define (align n) - (cond - [(fxeven? n) n] - [else (fxadd1 n)])) - ;;; - (define (extend-env* lhs* si live env) - (let f ([lhs* lhs*] [si si] [live live] [env env] [nlhs* '()]) - (cond - [(null? lhs*) - (values nlhs* si live env)] - [else - (let ([fv (make-fvar si)]) - (f (cdr lhs*) (fxadd1 si) (cons si live) - (cons (cons (car lhs*) fv) env) - (cons fv nlhs*)))]))) - ;;; - (define (insert-const-alloc-check n si live rest) - (cond - [(fxzero? n) rest] - [else - (make-seq - (make-alloc-check n si live) - rest)])) - ;;; - (define (construct-closures n* lhs* nlhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (make-seq 'FIXME:construct-closures body)])) - ;;; - (define (do-fix lhs* rhs* si live env body k) - (define (compute-closure-size x) - (record-case x - [(closure label free*) - (align (fxadd1 (length free*)))])) - (let ([n* (map compute-closure-size rhs*)]) - (let ([n (sum n*)]) - (let-values ([(nlhs* si live env) - (extend-env* lhs* si live env)]) - (let-values ([(x msi call?) - (k body si live env)]) - (values (insert-const-alloc-check n si live - (construct-closures n* lhs* nlhs* rhs* x)) - msi call?)))))) - ;;; - (define (constant-rep x) - 'FIXME:constant-rep) - ;;; - (define (do-closure label free* si live env) - 'FIXME:do-closure) - ;;; - (define (do-forcall x si live env) - (values 'FIXME:do-forcall si #f)) - ;;; - (define (do-tail-funcall x si live env) - (values 'FIXME:do-tail-funcall si #f)) - ;;; - (define (do-tail-appcall x si live env) - (values 'FIXME:do-tail-appcall si #f)) - ;;; - (define (do-tail-jmpcall x si live env) - (values 'FIXME:do-tail-jmpcall si #f)) - ;;; - (define (do-effect-funcall x si live env) - (values 'FIXME:do-effect-funcall si #f)) - ;;; - (define (do-effect-appcall x si live env) - (values 'FIXME:do-effect-appcall si #f)) - ;;; - (define (do-effect-jmpcall x si live env) - (values 'FIXME:do-effect-jmpcall si #f)) - ;;; - (define (do-value-funcall x si live env) - (values 'FIXME:do-value-funcall si #f)) - ;;; - (define (do-value-appcall x si live env) - (values 'FIXME:do-value-appcall si #f)) - ;;; - (define (do-value-jmpcall x si live env) - (values 'FIXME:do-value-jmpcall si #f)) - ;;; - (define (do-mvcall x si live env k) - (values 'FIXME:do-mvcall si #t)) - ;;; - (define (Var x env) - (cond - [(assq x env) => cdr] - [else (error who "unbound var ~s" x)])) - ;;; - (define (Primref x) - 'FIXME:primref) - ;;; - (define (Value x si live env) + (define (make-closure x) (record-case x - [(constant t) - (values (make-move (constant-rep t) acr) 0 #f)] - [(var) - (values (make-move (Var x env) acr) 0 #f)] - [(primref) - (values (make-move (Primref x) acr) 0 #f)] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* si live env env body Value)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* si live env body Value)] - [(conditional e0 e1 e2) - (do-cond e0 si live env e1 e2 Value)] - [(seq e0 e1) (do-seq e0 si live env e1 Value)] - [(closure label free*) - (values (do-closure label free* si live env) 0 #f)] - [(forcall) (do-forcall x si live env)] - [(funcall) (do-value-funcall x si live env)] - [(jmpcall) (do-value-jmpcall x si live env)] - [(appcall) (do-value-appcall x si live env)] - [(mvcall) (do-mvcall x si live env Value)] - [else (error who "invalid value expr ~s" x)])) + [(closure code free*) + (cond + [(null? free*) x] + [else + (make-prim 'make-closure + (list code (make-constant (length free*))))])])) ;;; - (define (Pred x si live env) - (record-case x - [(constant t) - (values (if t #t #f) 0 #f)] - [(var) (values (make-cmp 'neq (Var x env) false-object) 0 #f)] - [(primref) (values #t 0 #f)] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* si live env env body Pred)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* si live env body Pred)] - [(conditional e0 e1 e2) - (do-cond e0 si live env e1 e2 Pred)] - [(seq e0 e1) (do-seq e0 si live env e1 Pred)] - [(closure label free*) (values #t 0 #f)] - [(forcall) - (let-values ([(x msi call?) (Value x si live env)]) - (values (make-seq x (make-cmp 'neq acr false-object)) msi call?))] - [(funcall) - (let-values ([(x msi call?) (Value x si live env)]) - (values (make-seq x (make-cmp 'neq acr false-object)) msi call?))] - [(jmpcall) - (let-values ([(x msi call?) (Value x si live env)]) - (values (make-seq x (make-cmp 'neq acr false-object)) msi call?))] - [(appcall) - (let-values ([(x msi call?) (Value x si live env)]) - (values (make-seq x (make-cmp 'neq acr false-object)) msi call?))] - [(mvcall) (do-mvcall x si live env Pred)] - [else (error who "invalid pred expr ~s" x)])) + (define (closure-sets var x) + (record-case x + [(closure code free*) + (let f ([i 0] [free* free*]) + (cond + [(null? free*) (make-primcall 'void '())] + [else + (make-seq + (make-primcall 'closure-set! + (list var (make-constant i) (car free*))) + (f (fxadd1 i) (cdr free*)))]))])) ;;; - (define (Effect x si live env) - (record-case x - [(constant) (values 'nop 0 #f)] - [(var) (values 'nop 0 #f)] - [(primref) (values 'nop 0 #f)] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* si live env env body Effect)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* si live env body Effect)] - [(conditional e0 e1 e2) - (do-cond e0 si live env e1 e2 Effect)] - [(seq e0 e1) (do-seq e0 si live env e1 Effect)] - [(closure label free*) (values 'nop 0 #f)] - [(forcall) (do-forcall x si live env)] - [(funcall) (do-effect-funcall x si live env)] - [(jmpcall) (do-effect-jmpcall x si live env)] - [(appcall) (do-effect-appcall x si live env)] - [(mvcall) (do-mvcall x si live env Tail)] - [else (error who "invalid effect expr ~s" x)])) - ;;; - (define (Tail x si live env) - (record-case x - [(constant) (values x si #f)] - [(var) (values (Var x env) si #f)] - [(primref) (values x si #f)] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* si live env env body Tail)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* si live env body Tail)] - [(conditional e0 e1 e2) - (do-cond e0 si live env e1 e2 Tail)] - [(seq e0 e1) (do-seq e0 si live env e1 Tail)] - [(closure label free*) - (values (do-closure label free* si live env) si #f)] - [(forcall) - (let-values ([(x msi call?) (do-forcall x si live env)]) - (values x msi call?))] - [(funcall) (do-tail-funcall x si live env)] - [(jmpcall) (do-tail-jmpcall x si live env)] - [(appcall) (do-tail-appcall x si live env)] - [(mvcall) (do-mvcall x si live env Tail)] - [else (error who "invalid tail expr ~s" x)])) - ;;; - (define (MainTail x si live env) - (let-values ([(x msi call?) - (Tail x si live env)]) - (if call? - (make-seq 'FIXME:stack-overflow-check x) - x))) - (define (ClambdaCase free*) - (define (bind-free ls) - (let f ([ls ls] [i 0] [env '()]) + (define (do-fix lhs* rhs* body) + (make-bind lhs* + (map make-closure rhs*) + (let f ([lhs* lhs*] [rhs* rhs*]) (cond - [(null? ls) env] + [(null? lhs*) body] [else - (f (cdr ls) (fxadd1 i) - (cons (cons (car ls) (make-cpvar i)) env))]))) - (define (do-info x env) - (record-case x - [(case-info label args proper) - (let f ([ls args] [env env] [si 0] [live '()]) - (cond - [(null? ls) (values env si live)] - [else - (let ([fv (make-fvar si)]) - (f (cdr ls) - (cons (cons (car ls) fv) env) - (fxadd1 si) - (cons si live)))]))])) - (let ([env (bind-free free*)]) - (lambda (x) - (record-case x - [(clambda-case info body) - (let-values ([(env si live) (do-info info env)]) - (make-clambda-case info (MainTail body si live env)))] - [else (error who "invalid clambda-case ~s" x)])))) + (make-seq + (closure-sets (car lhs*) (car rhs*)) + (f (cdr lhs*) (cdr rhs*)))])))) + ;;; + (define (Expr x) + (record-case x + [(constant) x] + [(var) x] + [(primref) x] + [(bind lhs* rhs* body) + (make-bind lhs* (map Expr rhs*) (Expr body))] + [(fix lhs* rhs* body) + (do-fix lhs* rhs* (Expr body))] + [(conditional e0 e1 e2) + (make-conditional (Expr e0) (Expr e1) (Expr e2))] + [(seq e0 e1) + (make-seq (Expr e0) (Expr e1))] + [(closure) + (let ([t (unique-var 'tmp)]) + (Expr (make-fix (list t) (list x) t)))] + [(primcall op arg*) + (make-appcall (make-primref op) (map Expr arg*))] + [(forcall op arg*) + (make-forcall op (map Expr arg*))] + [(funcall rator arg*) + (make-funcall (Expr rator) (map Expr arg*))] + [(jmpcall label rator arg*) + (make-jmpcall label (Expr rator) (map Expr arg*))] + [(appcall rator arg*) + (error who "appcall not supported yet") + (make-appcall (Expr rator) (map Expr arg*))] + [(mvcall rator k) + (make-mvcall (Expr rator) (Clambda k))] + [else (error who "invalid expr ~s" x)])) + ;;; + (define (ClambdaCase x) + (record-case x + [(clambda-case info body) + (make-clambda-case info (Expr body))] + [else (error who "invalid clambda-case ~s" x)])) ;;; (define (Clambda x) (record-case x [(clambda label case* free*) - (make-clambda label (map (ClambdaCase free*) case*) free*)] + (make-clambda label (map ClambdaCase case*) free*)] [else (error who "invalid clambda ~s" x)])) ;;; (define (Program x) (record-case x [(codes code* body) - (make-codes (map Clambda code*) (MainTail body 0 '() '()))] + (make-codes (map Clambda code*) (Expr body))] + [else (error who "invalid program ~s" x)])) + ;;; + (Program x)) + + +(define (specify-representation x) + (define who 'specify-representation) + ;;; + (define nop (make-primcall 'nop '())) + ;;; + (define (constant-rep x) + (let ([c (constant-value x)]) + (cond + [(fixnum? c) (* c fixnum-scale)] + [(boolean? c) (if c bool-t bool-f)] + [(void? c) void-object] + [(bwp? c) bwp-object] + [(char? c) (fxlogor (fxsll (char->integer c) char-shift) + char-tag)] + [(null? c) nil] + [else x]))) + ;;; + (define (Effect x) + (record-case x + [(constant c) nop] + [(var) nop] + [(primref) nop] + [(closure code free*) nop] + [(bind lhs* rhs* body) + (make-bind lhs* (map Value rhs*) (Effect body))] + [(conditional e0 e1 e2) + (make-conditional (Pred e0) (Effect e1) (Effect e2))] + [(seq e0 e1) + (make-seq (Effect e0) (Effect e1))] + [(primcall op arg*) + (error who "effect prim ~a not supported" op)] + [(forcall op arg*) + (error who "effect forcall not supported" op)] + [(funcall rator arg*) + (make-funcall (Value rator) (map Value arg*))] + [(jmpcall label rator arg*) + (make-jmpcall label (Value rator) (map Value arg*))] + [(appcall rator arg*) + (error who "appcall not supported yet")] + [(mvcall rator x) + (make-mvcall (Value rator) (Clambda x Effect))] + [else (error who "invalid pred expr ~s" x)])) + ;;; + (define (Pred x) + (record-case x + [(constant c) (if c #t #f)] + [(var) (mkprm '!= (list x bool-f))] + [(primref) #t] + [(closure code free*) #t] + [(bind lhs* rhs* body) + (make-bind lhs* (map Value rhs*) (Pred body))] + [(conditional e0 e1 e2) + (make-conditional (Pred e0) (Pred e1) (Pred e2))] + [(seq e0 e1) + (make-seq (Effect e0) (Pred e1))] + [(primcall op arg*) + (error who "pred prim ~a not supported" op)] + [(forcall op arg*) + (error who "pred forcall not supported" op)] + [(funcall rator arg*) + (mkprm '!= + (list (make-funcall (Value rator) (map Value arg*)) + bool-f))] + [(jmpcall label rator arg*) + (mkprm '!= + (list (make-jmpcall label (Value rator) (map Value arg*)) + bool-f))] + [(appcall rator arg*) + (error who "appcall not supported yet")] + [(mvcall rator x) + (make-mvcall (Value rator) (Clambda x Pred))] + [else (error who "invalid pred expr ~s" x)])) + ;;; + (define (Value x) + (record-case x + [(constant) (constant-rep x)] + [(var) x] + [(primref) x] + [(bind lhs* rhs* body) + (make-bind lhs* (map Value rhs*) (Value body))] + [(conditional e0 e1 e2) + (make-conditional (Pred e0) (Value e1) (Value e2))] + [(seq e0 e1) + (make-seq (Effect e0) (Value e1))] + [(primcall op arg*) + (error who "value prim ~a not supported" op)] + [(forcall op arg*) + (error who "value forcall not supported" op)] + [(funcall rator arg*) + (make-funcall (Value rator) (map Value arg*))] + [(jmpcall label rator arg*) + (make-jmpcall label (Value rator) (map Value arg*))] + [(appcall rator arg*) + (error who "appcall not supported yet")] + [(mvcall rator x) + (make-mvcall (Value rator) (Clambda x Value))] + [else (error who "invalid value expr ~s" x)])) + ;;; + (define (ClambdaCase x k) + (record-case x + [(clambda-case info body) + (make-clambda-case info (k body))] + [else (error who "invalid clambda-case ~s" x)])) + ;;; + (define (Clambda x k) + (record-case x + [(clambda label case* free*) + (make-clambda label + (map (lambda (x) (ClambdaCase x k)) case*) + free*)] + [else (error who "invalid clambda ~s" x)])) + ;;; + (define (Program x) + (record-case x + [(codes code* body) + (make-codes + (map (lambda (x) (Clambda x Value)) code*) + (Value body))] [else (error who "invalid program ~s" x)])) ;;; (Program x)) @@ -534,11 +413,12 @@ - (define (new-cogen x) (verify-new-cogen-input x) - (let ([x (remove-primcalls x)]) - (new-cogen-pass1 x))) + (let* ([x (remove-primcalls x)] + [x (eliminate-fix x)] + [x (specify-representation x)]) + x)) diff --git a/src/libintelasm.ss b/src/libintelasm.ss index 83e101d..6327c95 100644 --- a/src/libintelasm.ss +++ b/src/libintelasm.ss @@ -263,7 +263,7 @@ (define label-name (lambda (x) (cadr x))) -(define int? fixnum?) +(define int? integer?) (define obj? (lambda (x) diff --git a/src/racompiler.ss b/src/racompiler.ss new file mode 100755 index 0000000..57b6ae2 --- /dev/null +++ b/src/racompiler.ss @@ -0,0 +1,153 @@ +#!/usr/bin/env ikarus --script +(define (racompile x) + ;;; + (define-syntax record-case + (lambda (x) + (define (enumerate fld* i) + (syntax-case fld* () + [() #'()] + [(x . x*) + (with-syntax ([i i] [i* (enumerate #'x* (fx+ i 1))]) + #'(i . i*))])) + (define (generate-body ctxt cls*) + (syntax-case cls* (else) + [() (with-syntax ([x x]) #'(error #f "unmatched ~s in ~s" v #'x))] + [([else b b* ...]) #'(begin b b* ...)] + [([(rec-name rec-field* ...) b b* ...] . rest) (identifier? #'rec-name) + (with-syntax ([altern (generate-body ctxt #'rest)] + [(id* ...) (enumerate #'(rec-field* ...) 0)] + [rtd #'(type-descriptor rec-name)]) + #'(if (#%$record/rtd? v rtd) + (let ([rec-field* (#%$record-ref v id*)] ...) + b b* ...) + altern))])) + (syntax-case x () + [(_ expr cls* ...) + (with-syntax ([body (generate-body #'_ #'(cls* ...))]) + #'(let ([v expr]) body))]))) + ;;; + (define-record constant (val)) + (define (mkconst v) (make-constant v)) + (define-record int (val)) + (define (mkint v) (make-int v)) + (define-record set (lhs rhs)) + (define (mkset x v) (make-set x v)) + (define-record reg (name)) + (define (mkreg x) (make-reg x)) + (define-record primcall (op rand*)) + (define (mkprm op . rand*) (make-primcall op rand*)) + (define-record seq (e0 e1)) + (define (mkseq e0 e1) (make-seq e0 e1)) + ;;; + (define (recordize x) + (define who 'recordize) + ;;; + (define (E x r) + (cond + [(pair? x) + (case (car x) + [(quote) (mkconst (cadr x))] + [else (error who "invalid expression ~s" x)])] + [else (error who "invalid expression ~s" x)])) + ;;; + (E x '())) + ;;; + (define (specify-representation x) + (define who 'specify-representation) + ;;; + (define fixnum-scale 4) + ;;; + (define (immediate? c) + (or (fixnum? c))) + ;;; + (define (immediate-rep c) + (cond + [(fixnum? c) (mkint (* c fixnum-scale))] + [else (error 'immediate-rep "invalid ~s" c)])) + ;;; + (define (Tail x) + (record-case x + [(constant c) + (if (immediate? c) + (immediate-rep c) + x)] + [else (error who "invalid tail ~s" x)])) + ;;; + (Tail x)) + ;;; + (define (impose-calling-convention x) + (define who 'impose-calling-convention) + ;;; + (define rv-register (mkreg '%eax)) + ;;; + (define (Tail x) + (record-case x + [(constant c) + (mkseq (mkset rv-register x) + (mkprm 'return rv-register))] + [else (error who "invalid tail ~s" x)])) + ;;; + (Tail x)) + ;;; + (define (linearize x) + (define who 'linearize) + ;;; + (define (op x) + (record-case x + [(register r) r] + [(constant c) `(obj ,c)] + [(int i) `(int ,i)] + ;;; + (define (Effect x ac) + (record-case x + [(seq e0 e1) + (Effect e0 (Effect e1 ac))] + [(set targ v) + (cons `(movl ,(op v) ,(op targ)) ac)] + [else (error who "invalid effect ~s" x)])) + ;;; + (define (Tail x ac) + (record-case x + [(seq e0 e1) + (Effect e0 (Tail e1 ac))] + [(primcall op rands) + (case op + [(return) + (cons '(ret) ac)] + [else (error who "invalid tail prim ~s" op)])] + [else (error who "invalid tail ~s" x)])) + ;;; + (list (Tail x '()))) + ;;; + (define (compile x) + (let* ([x (expand x)] + [x (recordize x)] + [x (specify-representation x)] + [x (impose-calling-convention x)] + [x* (linearize x)] + [code (car (#%list*->code* + (lambda (x) #f) + x*))]) + ((#%$code->closure code)))) + (compile x)) + + + +(define-syntax add-tests-with-string-output + (syntax-rules (=>) + [(_ name [expr* => str*] ...) + (begin + (printf "SECTION ~a ...\n" 'name) + (let ([str str*] + [expr 'expr*]) + (printf "testing ~s\n" expr) + (let ([r (with-output-to-string + (lambda () + (write (racompile expr)) + (newline)))]) + (unless (string=? r str) + (error #f "expected ~s, got ~s\n" str r)))) + ...)])) + +(load "tests/tests-1.1-req.scm") +