;;;; File: list-bindings-run.scm ;;;; Author: Juergen Lorenz ;;;; ju (at) jugilo (dot) de (require-library list-bindings) (import list-bindings) ;;; (run-tests xpr0 xpr1 ...) ;;; ------------------------- ;;; evaluates each expression xpr0 xpr1 ... and reports it as failed, if ;;; it evaluates to #f, and as passed otherwise (define-syntax run-tests (syntax-rules () ((_ xpr ...) (begin (display "\nTesting ...\n") (display "-----------\n") (let ((n (simple-tests-run (list 'xpr ...)))) (display "-----------\n") (if (zero? n) (display "All tests passed\n\n") (begin (display n) (display " test(s) failed!!!\n\n")))))))) (define (simple-tests-run lst) (let loop ((lst lst) (n 0)) (if (null? lst) n (if (eval (car lst)) (begin (display "passed ... ") (write (car lst)) (newline) (loop (cdr lst) n)) (begin (display "FAILED !!! ") (write (car lst)) (newline) (loop (cdr lst) (+ n 1))))))) (run-tests "TEST BINDING MACROS" (= (bind a 1 a) 1) (equal? (bind (a b) '(1 2) (list a b)) '(1 2)) (equal? (bind (x y z w) '(1 2 3 4) (list x y z w)) '(1 2 3 4)) (equal? (bind (x (y (z . u) . v) . w) '(1 (2 (3 4) 5) 6) (list x y z u v w)) '(1 2 3 (4) (5) (6))) (equal? (bind-case '(1 (2 3)) ((x (y z)) (list x y z)) ((x (y . z)) (list x y z)) ((x y) (list x y))) '(1 2 3)) (equal? (bind-case '(1 (2 3)) ((x (y . z)) (list x y z)) ((x y) (list x y)) ((x (y z)) (list x y z))) '(1 2 (3))) (equal? (bind-case '(1 (2 3)) ((x y) (list x y)) ((x (y . z)) (list x y z)) ((x (y z)) (list x y z))) '(1 (2 3))) (equal? (bind-case '(1 (2 . 3)) ((x y) (list x y)) ((x (y . z)) (list x y z)) ((x (y z)) (list x y z))) '(1 (2 . 3))) (equal? (letrec ( (my-map (lambda (fn lst) (bind-case lst (() '()) ((x . xs) (cons (fn x) (map fn xs)))))) ) (my-map add1 '(1 2 3))) '(2 3 4)) ((bindable? (a b)) '(1 2)) ((bindable? (a b)) '(1 2)) (not ((bindable? (x)) '(name 1))) ((bindable? (_ x)) '(name 1)) (not ((bindable? (_ x)) '(name 1 2))) ((bindable? (_) (_ x y) (_ x y)) '(name 1 2)) "TEST LOW-LEVEL MACROS" (define-er-macro (efreeze xpr) (renaming (% %lambda) (comparing () `(,%lambda () ,xpr)))) (= ((efreeze 3)) 3) (define-ir-macro (ifreeze xpr) (injecting () (comparing () `(lambda () ,xpr)))) (= ((ifreeze 5)) 5) (define-ir-macro (alambda args xpr . xprs) (injecting (self) (comparing () `(letrec ((,self (lambda ,args ,xpr ,@xprs))) ,self)))) (define ! (alambda (n) (if (zero? n) 1 (* n (self (- n 1)))))) (= (! 5) 120) (define-ir-macro (foo pair) (injecting () (comparing (? bar?) `(if ,(bar? (car pair)) ,@(cdr pair) 'unchecked)))) (eq? (foo (bar 'checked)) 'checked) (eq? (foo (baz 'checked)) 'unchecked) (define-er-macro (baz pair) (renaming (% %if) (comparing (? bar?) `(,%if ,(bar? (car pair)) ,@(cdr pair) 'unchecked)))) (eq? (baz (bar 'checked)) 'checked) (eq? (baz (foo 'checked)) 'unchecked) )