~ chicken-core (chicken-5) /tests/module-tests-2.scm
Trap1;;;; module-tests-2.scm234(module oo (output-of)5 (import scheme chicken.port)6 (define-syntax output-of7 (syntax-rules ()8 ((_ exp) (with-output-to-string (lambda () exp)))))9)1011(module mscheme (lambda)12 (import (rename scheme (lambda s:lambda))13 (chicken module))14 (reexport (except scheme lambda))15 (define-syntax lambda16 (syntax-rules ()17 ((_ llist . body)18 (let ((results #f))19 (s:lambda20 llist21 (if results22 (apply values results)23 (call-with-values (s:lambda () . body)24 (s:lambda rs25 (set! results rs)26 (apply values rs)))))))))27)2829(module m (f1 f2)30 (import mscheme)31 (define (f1)32 (display 'f1) (newline)33 'f1)34 (define f235 (lambda ()36 (display 'f2) (newline)37 'f2))38)3940(module mtest ()41 (import scheme m (chicken base) oo)42 (assert (string=? "f1\n" (output-of (f1))))43 (assert (string=? "f1\n" (output-of (f1))))44 (assert (string=? "f2\n" (output-of (f2))))45 (assert (string=? "" (output-of (f2)))))4647;;;4849(module m1 (lambda f1 f2)50 (import (rename scheme (lambda s:lambda)))5152 (define-syntax lambda53 (syntax-rules ()54 ((_ llist . body)55 (s:lambda llist (display 'llist) (newline) . body))))5657 (define (f1) ; should use standard lambda58 (display 'f1)59 (newline))6061 (define f262 (lambda (x) ; should be our lambda63 (display 'f2)64 (newline)))6566)6768(module mtest2 (f3 f4)69 (import (except scheme lambda) m1 (chicken base) oo)7071 (define (f3) ; standard lambda72 (display 'f3)73 (newline))7475 (define f4 ; our lambda76 (lambda (x)77 (display 'f4)78 (newline)))7980 (assert (string=? "f1\n" (output-of (f1))))81 (assert (string=? "(x)\nf2\n" (output-of (f2 'yes))))82 (assert (string=? "f3\n" (output-of (f3))))83 (assert (string=? "(x)\nf4\n" (output-of (f4 'yes)))))8485(module m2 ()86 (import m1)87 ((lambda () (f1)))) ; should use new lambda (but should be folded by compiler)8889;; #1132 - internal definitions honor redefinitions of defining forms90(module m3 ()91 (import (rename scheme (define s:define)))92 (import (only (chicken base) assert))93 (define-syntax define94 (syntax-rules ()95 ((_) (display 'oink))96 ((_ var value) (s:define var (+ value 1)))))97 (define)98 ;; Internal definition uses new "define"99 (let ()100 (define a 1)101 (assert (= a 2)))102103 ;; Toplevel definition also uses new "define"104 (define b 5)105 (assert (= b 6)))