;;; examples.ms ;;; Copyright 1984-2017 Cisco Systems, Inc. ;;; ;;; Licensed under the Apache License, Version 2.0 (the "License"); ;;; you may not use this file except in compliance with the License. ;;; You may obtain a copy of the License at ;;; ;;; http://www.apache.org/licenses/LICENSE-2.0 ;;; ;;; Unless required by applicable law or agreed to in writing, software ;;; distributed under the License is distributed on an "AS IS" BASIS, ;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ;;; See the License for the specific language governing permissions and ;;; limitations under the License. ;;; define *examples-directory* in Makefile (define-syntax examples-mat (syntax-rules () [(_ name (file ...) expr ...) (begin (mat name (begin (parameterize ((source-directories (cons *examples-directory* (source-directories)))) (load (format "~a/~a.ss" *examples-directory* file)) ...) #t) expr ...) (mat name (begin (parameterize ((source-directories (cons *examples-directory* (source-directories)))) (load (format "~a/~a.so" *examples-directory* file)) ... #t)) expr ...))])) (define load-example (case-lambda [(str) (load (format "~a/~a.ss" *examples-directory* str)) #t] [(str eval) (load (format "~a/~a.ss" *examples-directory* str) eval) #t])) (define (example-file file) (format "~a/~a" *mats-dir* file)) (define file=? (lambda (fn1 fn2) (let ([p1 (open-input-file fn1)] [p2 (open-input-file fn2)]) (let loop () (let ([c1 (read-char p1)] [c2 (read-char p2)]) (if (eof-object? c1) (begin (close-port p1) (close-port p2) (eof-object? c2)) (and (not (eof-object? c2)) (char=? c1 c2) (loop)))))))) (examples-mat def-edit ("def" "edit") (begin (def fact (lambda (x) (if (zero? x) 1 (* x (fact ( x 1)))))) (procedure? fact)) (equal? (ls-def) '(fact)) (let ([in (open-input-string "3 3 4 3 2 (ib 1 -) t")] [out (open-output-string)]) (and (eqv? (parameterize ([current-input-port in] [current-output-port out]) (ed-def fact)) 'fact) (equal? (get-output-string out) "(def fact (lambda (...) (...))) edit> (lambda (x) (if (...) 1 (...))) edit> (if (zero? x) 1 (* x (...))) edit> (* x (fact (...))) edit> (fact (x 1)) edit> (x 1) edit> (- x 1) edit> (def fact (lambda (...) (...))) edit> "))) (eqv? (fact 30) 265252859812191058636308480000000) ) (examples-mat fact ("fact") (eqv? (fact 30) 265252859812191058636308480000000) ) (examples-mat fatfib ("fatfib") (eqv? (fatfib 10) 89) ) (examples-mat fib ("fib") (begin (printf "***** expect trace of (fib 4):~%") (eqv? (fib 4) 5)) ) (examples-mat freq ("freq") ;; freq.in and freq.out come from example in TSPL (begin (delete-file "testfile.freq" #f) #t) (begin (frequency (example-file "freq.in") "testfile.freq") (file=? "testfile.freq" (example-file "freq.out"))) ) ;-------- freq.in: -------- ;Peter Piper picked a peck of pickled peppers; ;A peck of pickled peppers Peter Piper picked. ;If Peter Piper picked a peck of pickled peppers, ;Where's the peck of pickled peppers Peter Piper picked? ;-------- freq.out: -------- ;1 A ;1 If ;4 Peter ;4 Piper ;1 Where ;2 a ;4 of ;4 peck ;4 peppers ;4 picked ;4 pickled ;1 s ;1 the ; "interpret" can't handle all Chez core forms ;(mat interpret ; (and (eq? (getprop 'interpret '*type*) 'primitive) ; (begin (remprop 'interpret '*type*) #t)) ; (load-example "interpret") ; (load-example "interpret" interpret) ; (load-example "fatfib" interpret) ; (eqv? (fatfib 4) 5) ; (begin (putprop 'interpret '*type* 'primitive) #t) ; ) (examples-mat m4 ("m4") (begin (m4 "testfile.m4" (example-file "m4test.in")) (file=? (example-file "m4test.out") "testfile.m4")) ) (examples-mat macro ("macro") (begin (macro xxxxxx (lambda (x) `',x)) #t) (equal? (xxxxxx 3) '(xxxxxx 3)) ) (examples-mat matrix ("matrix") ;; examples from TSPL2: (equal? (mul 3 4) 12) (equal? (mul 1/2 '#(#(1 2 3))) '#(#(1/2 1 3/2))) (equal? (mul -2 '#(#(3 -2 -1) #(-3 0 -5) #(7 -1 -1))) '#(#(-6 4 2) #(6 0 10) #(-14 2 2))) (equal? (mul '#(#(1 2 3)) '#(#(2 3) #(3 4) #(4 5))) '#(#(20 26))) (equal? (mul '#(#(2 3 4) #(3 4 5)) '#(#(1) #(2) #(3))) '#(#(20) #(26))) (equal? (mul '#(#(1 2 3) #(4 5 6)) '#(#(1 2 3 4) #(2 3 4 5) #(3 4 5 6))) '#(#(14 20 26 32) #(32 47 62 77))) ) (examples-mat object ("object") (begin (define-object (summit x) ([y 3]) ([getx (lambda () x)] [sumxy (lambda () (+ x y))] [setx (lambda (v) (set! x v))])) (procedure? summit)) (begin (define a (summit 1)) (procedure? a)) (eq? (send-message a getx) 1) (eq? (send-message a sumxy) 4) (begin (send-message a setx 13) (eq? (send-message a sumxy) 16)) ;; examples from TSPL: (begin (define-object (kons kar kdr) ([get-car (lambda () kar)] [get-cdr (lambda () kdr)] [set-car! (lambda (x) (set! kar x))] [set-cdr! (lambda (x) (set! kdr x))])) (procedure? kons)) (begin (define p (kons 'a 'b)) (procedure? p)) (eq? (send-message p get-car) 'a) (eq? (send-message p get-cdr) 'b) (begin (send-message p set-cdr! 'c) (eq? (send-message p get-cdr) 'c)) (begin (define-object (kons kar kdr pwd) ([get-car (lambda () kar)] [get-cdr (lambda () kar)] [set-car! (lambda (x p) (when (string=? p pwd) (set! kar x)))] [set-cdr! (lambda (x p) (when (string=? p pwd) (set! kar x)))])) (procedure? kons)) (begin (define p1 (kons 'a 'b "magnificent")) (procedure? p1)) (begin (send-message p1 set-car! 'c "magnificent") (eq? (send-message p1 get-car) 'c)) (begin (send-message p1 set-car! 'd "please") (eq? (send-message p1 get-car) 'c)) (begin (define p2 (kons 'x 'y "please")) (procedure? p2)) (begin (send-message p2 set-car! 'z "please") (eq? (send-message p2 get-car) 'z)) (begin (define-object (kons kar kdr) ([count 0]) ([get-car (lambda () (set! count (+ count 1)) kar)] [get-cdr (lambda () (set! count (+ count 1)) kdr)] [accesses (lambda () count)])) (procedure? kons)) (begin (define p (kons 'a 'b)) (procedure? p)) (eq? (send-message p get-car) 'a) (eq? (send-message p get-cdr) 'b) (eq? (send-message p accesses) '2) (eq? (send-message p get-cdr) 'b) (eq? (send-message p accesses) '3) ) (examples-mat power ("power") (eqv? (power 1/2 3) 1/8) ) (examples-mat rabbit ("rabbit") (begin (printf "***** expect rabbit output:~%") (rabbit 3) (dispatch) #t) ) (examples-mat rsa ("rsa") (begin (printf "***** expect rsa output:~%") (make-user bonzo) (make-user bobo) (make-user tiger) (show-center) #t) (equal? (send "hi there" bonzo bobo) "hi there") (equal? (send "hi there to you" bobo bonzo) "hi there to you") (not (equal? (decrypt (encrypt "hi there" bonzo bobo) tiger) "hi there")) ) (define stream->list (lambda (s) (if (procedure? s) '() (cons (car s) (stream->list (cdr s)))))) (examples-mat scons ("scons") (eqv? (stream-ref factlist 3) 6) (equal? (stream->list factlist) '(1 1 2 6)) (eqv? (stream-ref factlist 10) 3628800) (equal? (stream->list factlist) '(1 1 2 6 24 120 720 5040 40320 362880 3628800)) (eqv? (stream-ref fiblist 3) 3) (equal? (stream->list fiblist) '(1 1 2 3)) (eqv? (stream-ref fiblist 5) 8) (equal? (stream->list fiblist) '(1 1 2 3 5 8)) ) (examples-mat setof ("setof") (equal? (set-of x (x in '(a b c))) '(a b c)) (equal? (set-of x (x in '(1 2 3 4)) (even? x)) '(2 4)) (equal? (set-of (cons x y) (x in '(1 2 3)) (y is (* x x))) '((1 . 1) (2 . 4) (3 . 9))) (equal? (set-of (cons x y) (x in '(a b)) (y in '(1 2))) '((a . 1) (a . 2) (b . 1) (b . 2))) ) (examples-mat unify ("unify") ;; examples from TSPL: (eq? (unify 'x 'y) 'y) (equal? (unify '(f x y) '(g x y)) "clash") (equal? (unify '(f x (h)) '(f (h) y)) '(f (h) (h))) (equal? (unify '(f (g x) y) '(f y x)) "cycle") (equal? (unify '(f (g x) y) '(f y (g x))) '(f (g x) (g x))) ) (examples-mat fft ("fft") (equal? (dft '(0 0 0 0)) '(0 0 0 0)) (equal? (dft '(2.0 2.0 2.0 2.0)) '(8.0 0.0-0.0i 0.0 0.0+0.0i)) (equal? (dft '(+2.i +2.i +2.i +2.i)) '(+0.0+8.0i 0.0+0.0i 0.0+0.0i 0.0+0.0i)) ) (examples-mat compat ("compat") (eqv? (define! defined-with-define! (lambda () defined-with-define!)) 'defined-with-define!) (let ((p defined-with-define!)) (set! defined-with-define! 0) (eqv? (p) 0)) (eqv? (defrec! defined-with-defrec! (lambda () defined-with-defrec!)) 'defined-with-defrec!) (let ((p defined-with-defrec!)) (set! defined-with-defrec! 0) (eqv? (p) p)) (eqv? (begin0 1 2 3 4) 1) (equal? (recur f ((ls '(a b c)) (new '())) (if (null? ls) new (f (cdr ls) (cons (car ls) new)))) '(c b a)) (equal? (tree-copy '()) '()) (equal? (tree-copy 'a) 'a) (equal? (tree-copy '(a)) '(a)) (equal? (tree-copy '(a (b c) . d)) '(a (b c) . d)) (let* ((p1 '((a . b) c)) (p2 (car p1)) (p3 (cdr p1))) (let ((c1 (tree-copy p1))) (not (or (memq c1 (list p1 p2 p3)) (memq (car c1) (list p1 p2 p3)) (memq (cdr c1) (list p1 p2 p3)))))) (= *most-positive-short-integer* *most-positive-fixnum* (most-positive-fixnum)) (= *most-negative-short-integer* *most-negative-fixnum* (most-negative-fixnum)) (eof-object? *eof*) (eq? short-integer? fixnum?) (eq? big-integer? bignum?) (eq? ratio? ratnum?) (eq? float? flonum?) (eq? bound? top-level-bound?) (eq? global-value top-level-value) (eq? set-global-value! set-top-level-value!) (eq? define-global-value define-top-level-value) (eq? symbol-value top-level-value) (eq? set-symbol-value! set-top-level-value!) (eq? put putprop) (eq? get getprop) (eq? copy-list list-copy) (eq? copy-tree tree-copy) (eq? copy-string string-copy) (eq? copy-vector vector-copy) (eq? intern string->symbol) (eq? symbol-name symbol->string) (eq? make-temp-symbol gensym) (eq? temp-symbol? gensym?) (eq? string->uninterned-symbol gensym) (eq? uninterned-symbol? gensym?) (eq? compile-eval compile) (eq? closure? procedure?) (eq? =? =) (eq? ? >) (eq? <=? <=) (eq? >=? >=) (eq? float exact->inexact) (eq? rational inexact->exact) (eq? char-equal? char=?) (eq? char-less? charsymbol (string-append (symbol->string x) "!!!")))]) `'(,(test-function val)))) (equal? '(xyz!!!) (test-4 xyz))) (let () (define-macro (test-4 val) (let ([test-function (lambda (x) (string->symbol (string-append (symbol->string x) "!!!")))]) `'(,(test-function val)))) (equal? '(xyz!!!) (test-4 xyz))) (let () (define-macro test-5 (this . that) `'(,this ,that)) (equal? '(x (y z)) (test-5 x y z))) (let () (define-macro (test-5 this . that) `'(,this ,that)) (equal? '(x (y z)) (test-5 x y z))) (let () (define-macro test-6 (this . that) `'(,this ,@that)) (equal? '(x y z) (test-6 x y z))) (let () (define-macro (test-6 this . that) `'(,this ,@that)) (equal? '(x y z) (test-6 x y z))) (let () (defmacro test-1 (val) `',val) (equal? 'x (test-1 x))) (let () (defmacro (test-1 val) `',val) (equal? 'x (test-1 x))) (let () (defmacro test-2 (val) `'(,val)) (equal? '(x) (test-2 x))) (let () (defmacro (test-2 val) `'(,val)) (equal? '(x) (test-2 x))) (let ([xyz '(x y z)]) (defmacro test-3 (val) `(,@val)) (equal? '(x y z) (test-3 xyz))) (let ([xyz '(x y z)]) (defmacro (test-3 val) `(,@val)) (equal? '(x y z) (test-3 xyz))) (let () (defmacro test-4 (val) (let ([test-function (lambda (x) (string->symbol (string-append (symbol->string x) "!!!")))]) `'(,(test-function val)))) (equal? '(xyz!!!) (test-4 xyz))) (let () (defmacro (test-4 val) (let ([test-function (lambda (x) (string->symbol (string-append (symbol->string x) "!!!")))]) `'(,(test-function val)))) (equal? '(xyz!!!) (test-4 xyz))) (let () (defmacro test-5 (this . that) `'(,this ,that)) (equal? '(x (y z)) (test-5 x y z))) (let () (defmacro (test-5 this . that) `'(,this ,that)) (equal? '(x (y z)) (test-5 x y z))) (let () (defmacro test-6 (this . that) `'(,this ,@that)) (equal? '(x y z) (test-6 x y z))) (let () (defmacro (test-6 this . that) `'(,this ,@that)) (equal? '(x y z) (test-6 x y z))) (begin (define-struct! caramel x y z) (eqv? (caramel-x (caramel 1 2 3)) 1)) ) (examples-mat ez-grammar-test ("ez-grammar-test") (equal? (with-output-to-string ez-grammar-test) "8 tests ran\n") )