;;; File: ir-macros-run.scm (require 'ir-macros) (import ir-macros) (import-for-syntax (only ir-macros macro-rules) (only matchable match)) (define-syntax do-forever (macro-rules (inject compare? exit) ((_ . body) `(call/cc (lambda (,exit) (let loop () ,@body (loop))))))) (define foo (lambda (n) (let ((lst '())) (do-forever (if (zero? n) (exit lst)) (begin (set! lst (cons 'a lst)) (set! n (- n 1))))))) (macro-define (my-or . args) (lambda (inject compare?) (if (null? args) #f (let ((tmp (car args))) `(if ,tmp ,tmp (my-or ,@(cdr args))))))) (define (f n) (+ n 10)) (define (bar) (macro-let ( ((f n) (lambda (inject compare?) n)) ((g n) (lambda (inject compare?) `(f ,n))) ) (list (f 1) (g 1)))) (define (baz) (macro-letrec ( ((f n) (lambda (inject compare?) n)) ((g n) (lambda (inject compare?) `(f ,n))) ) (list (f 1) (g 1)))) (define (run) (if (and (= (my-or #f #f 2 #f) 2) (eq? (my-or) #f) (equal? (foo 3) '(a a a)) (equal? (bar) '(1 11)) (equal? (baz) '(1 1))) (print "All tests passed") (print "##### Some tests failed #####"))) (run)