919 lines
28 KiB
Scheme
919 lines
28 KiB
Scheme
;;; 5-1.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.
|
|
|
|
(mat eq?
|
|
(eq? 'a 'a)
|
|
(let ((x 203840238409238402384)) (eq? x x))
|
|
(let ((x (cons 3 4))) (eq? x x))
|
|
(not (eq? "hi there" (string-append "hi " "there")))
|
|
(not (eq? (cons '() '()) (cons '() '())))
|
|
)
|
|
|
|
(mat eqv?
|
|
(eqv? 'a 'a)
|
|
(not (eqv? '(a b (c)) "hi"))
|
|
(not (eqv? '(a b (c)) (list 'a 'b '(c))))
|
|
(not (eqv? 3.4 3.5))
|
|
(eqv? 3.4 3.4)
|
|
(eqv? 3/4 3/4)
|
|
(not (eqv? 3/4 4/5))
|
|
(not (eqv? 2.0 2))
|
|
(not (eqv? 4.5 9/2))
|
|
(eqv? 123124211123 123124211123)
|
|
(not (eqv? 123124211123 123124211124))
|
|
(not (eqv? "hi there" (string-append "hi " "there")))
|
|
(not (eqv? (vector 1 2 (vector 3 4) 5) '#(1 2 #(3 4) 5)))
|
|
(eqv? +nan.0 +nan.0)
|
|
(eqv? +inf.0 +inf.0)
|
|
(eqv? -inf.0 -inf.0)
|
|
(not (eqv? -inf.0 +inf.0))
|
|
(eqv? +0.0 +0.0)
|
|
(eqv? -0.0 -0.0)
|
|
(not (eqv? +0.0 -0.0))
|
|
(eqv? 3.0+0.0i 3.0+0.0i)
|
|
(eqv? 3.0-0.0i 3.0-0.0i)
|
|
(not (eqv? 3.0+0.0i 3.0-0.0i))
|
|
(not (eqv? 3.0+0.0i 3.0))
|
|
(not (eqv? 3.0 3))
|
|
(not (eqv? 3.0+4.0i 3+4i))
|
|
(not (eqv? 3 3.0))
|
|
(not (eqv? 3+4i 3.0+4.0i))
|
|
)
|
|
|
|
(mat equal?
|
|
(equal? 'a 'a)
|
|
(not (equal? '(a b (c)) "hi"))
|
|
(equal? '(a b (c)) (list 'a 'b '(c)))
|
|
(not (equal? '(a b (c)) '(a b (d))))
|
|
(equal? 123124211123 123124211123)
|
|
(not (equal? 123124211123 123124211124))
|
|
(equal? "hi there" (string-append "hi " "there"))
|
|
(not (equal? "hi there " "hi there"))
|
|
(equal? (vector 1 2 (vector 3 4) 5) '#(1 2 #(3 4) 5))
|
|
(not (equal? (vector 1 2 (vector 3 4) 5) '#(1 2 3 4 5)))
|
|
(equal? +nan.0 +nan.0)
|
|
(equal? +inf.0 +inf.0)
|
|
(equal? -inf.0 -inf.0)
|
|
(not (equal? -inf.0 +inf.0))
|
|
(equal? +0.0 +0.0)
|
|
(equal? -0.0 -0.0)
|
|
(not (equal? +0.0 -0.0))
|
|
(equal? 3.0+0.0i 3.0+0.0i)
|
|
(equal? 3.0-0.0i 3.0-0.0i)
|
|
(not (equal? 3.0+0.0i 3.0-0.0i))
|
|
(not (equal? 3.0+0.0i 3.0))
|
|
(not (equal? 3.0 3))
|
|
(not (equal? 3.0+4.0i 3+4i))
|
|
(not (equal? 3 3.0))
|
|
(not (equal? 3+4i 3.0+4.0i))
|
|
)
|
|
|
|
(mat new-equal? ; includes dag and cycle checks
|
|
(time (equal? '(a b c) '(a b c)))
|
|
(equal? '#1=(a b c . #1#) '#2=(a b c . #2#))
|
|
(not (equal? '#3=(a b c . #3#) '#4=(a b . #4#)))
|
|
(equal? '#5=(a b c . #5#) '#6=(a b c a b c . #6#))
|
|
(equal? '#7=(a b c . #7#) '(a b c a b c . #7#))
|
|
(not (equal? '#8=(a b c . #8#) '#9=(a b c a c . #9#)))
|
|
(andmap eq?
|
|
(let ([ls1 '#10=(a #10# c #10# d #11# f)]
|
|
[ls2 '#11=(a (a #11# c #10# d #11# f) c #10# d #11# f)])
|
|
(list (equal? ls1 ls1)
|
|
(equal? ls2 ls2)
|
|
(equal? ls1 ls2)
|
|
(equal? ls2 ls1)
|
|
(equal? (cadr ls1) ls2)
|
|
(equal? (cons 'g ls1) ls1)
|
|
(equal? (append ls1 '(g)) ls1)
|
|
(equal? (cdr ls1) (cdddr ls1))
|
|
(equal? (cdr ls1) (cdr (cadr ls2)))))
|
|
'(#t #t #t #t #t #f #f #f #t))
|
|
(andmap eq?
|
|
(let ([leaf1 (list "As a tree, I am huge.")]
|
|
[leaf2 (list "As a dag, I am small.")])
|
|
(let ([tr1 (let f ([n 100])
|
|
(if (= n 0)
|
|
leaf1
|
|
(let ([tr (f (- n 1))])
|
|
(cons tr tr))))]
|
|
[tr2 (let f ([n 100])
|
|
(if (= n 0)
|
|
leaf2
|
|
(let ([tr (f (- n 1))])
|
|
(cons tr tr))))])
|
|
(let ([ls (list (equal? tr1 tr1)
|
|
(equal? tr2 tr2)
|
|
(equal? tr1 tr2)
|
|
(equal? tr1 (car tr1)))])
|
|
(set-car! leaf1 (car leaf2))
|
|
(cons* (equal? tr1 tr1)
|
|
(equal? tr2 tr2)
|
|
(equal? tr1 tr2)
|
|
(equal? tr1 (cdr tr1))
|
|
ls))))
|
|
'(#t #t #t #f #t #t #f #f))
|
|
|
|
(time (equal? '#(a b c) '#(a b c)))
|
|
(equal? '#101=#(a b c #1#) '#102=#(a b c #2#))
|
|
(not (equal? '#103=#(a b c #103#) '#104=#(a b #104#)))
|
|
(equal? '#105=#(a b c #105#) '#106=#(a b c #(a b c #106#)))
|
|
(equal? '#107=#(a b c #107#) '#(a b c #(a b c #107#)))
|
|
(not (equal? '#108=#(a b c #108#) '#109=#(a b c #(a c #109#))))
|
|
(andmap eq?
|
|
(let ([v1 '#110=#(a #110# c #110# d #111# f)]
|
|
[v2 '#111=#(a #(a #111# c #110# d #111# f) c #110# d #111# f)]
|
|
[v3 '#112=#(a #(a #112# c #110# d #112# f) c #110# d #112# g)])
|
|
(list (equal? v1 v1)
|
|
(equal? v2 v2)
|
|
(equal? v3 v3)
|
|
(equal? v1 v2)
|
|
(equal? v2 v1)
|
|
(equal? v1 v3)
|
|
(equal? v2 v3)
|
|
(equal? v3 v1)
|
|
(equal? v3 v2)
|
|
(equal? (vector-ref v1 1) v2)))
|
|
'(#t #t #t #t #t #f #f #f #f #t))
|
|
(andmap eq?
|
|
(let ([leaf1 (vector "As a tree, I am huge.")]
|
|
[leaf2 (vector "As a dag, I am small.")])
|
|
(let ([tr1 (let f ([n 100])
|
|
(if (= n 0)
|
|
leaf1
|
|
(let ([tr (f (- n 1))])
|
|
(vector tr tr))))]
|
|
[tr2 (let f ([n 100])
|
|
(if (= n 0)
|
|
leaf2
|
|
(let ([tr (f (- n 1))])
|
|
(vector tr tr))))])
|
|
(let ([ls (list (equal? tr1 tr1)
|
|
(equal? tr2 tr2)
|
|
(equal? tr1 tr2)
|
|
(equal? tr1 (vector-ref tr1 0)))])
|
|
(vector-set! leaf1 0 (vector-ref leaf2 0))
|
|
(cons* (equal? tr1 tr1)
|
|
(equal? tr2 tr2)
|
|
(equal? tr1 tr2)
|
|
(equal? tr1 (vector-ref tr1 1))
|
|
ls))))
|
|
'(#t #t #t #f #t #t #f #f))
|
|
|
|
(let ([ls1 (make-list 100000 'a)]
|
|
[ls2 (make-list 100000 'a)])
|
|
(time
|
|
(let f ([n 1000])
|
|
(or (fx= n 0) (and (equal? ls1 ls2) (f (fx- n 1)))))))
|
|
|
|
(let ([v1 (make-vector 10000 (make-vector 100 'a))]
|
|
[v2 (make-vector 10000 (make-vector 100 'a))])
|
|
(time
|
|
(let f ([n 100])
|
|
(or (fx= n 0) (and (equal? v1 v2) (f (fx- n 1)))))))
|
|
|
|
(time
|
|
(let () ; w/sharing
|
|
(define (consup1 n)
|
|
(case n
|
|
[(0) '()]
|
|
[(1) 'a]
|
|
[(2) 3/4]
|
|
[(3) 3.416]
|
|
[else
|
|
(case (logand n 7)
|
|
[(0) (let ([x (consup1 (ash n -3))]) (cons x x))]
|
|
[(1) (make-vector 10 (consup1 (ash n -3)))]
|
|
[(2) (let ([x (cons #f (consup1 (ash n -3)))]) (set-car! x x) x)]
|
|
[(3) (let ([x (consup1 (ash n -3))]) (vector x 'a x))]
|
|
[(4) (cons (consup1 (ash n -3)) (consup1 (ash n -3)))]
|
|
[(5) (cons (string-copy "hello") (consup1 (ash n -3)))]
|
|
[(6) (list (consup1 (ash n -3)))]
|
|
[(7) (box (consup2 (ash n -3)))])]))
|
|
(define (consup2 n)
|
|
(case n
|
|
[(0) '()]
|
|
[(1) 'a]
|
|
[(2) 3/4]
|
|
[(3) 3.416]
|
|
[else
|
|
(case (logand n 7)
|
|
[(0) (cons (consup2 (ash n -3)) (consup2 (ash n -3)))]
|
|
[(1) (let ([x (make-vector 10 (consup1 (ash n -3)))])
|
|
(vector-set! x 5 (consup1 (ash n -3)))
|
|
x)]
|
|
[(2) (let ([x (cons #f (consup2 (ash n -3)))]) (set-car! x x) x)]
|
|
[(3) (let ([x (consup2 (ash n -3))]) (vector x 'a x))]
|
|
[(4) (let ([x (consup2 (ash n -3))]) (cons x x))]
|
|
[(5) (cons (string-copy "hello") (consup2 (ash n -3)))]
|
|
[(6) (list (consup2 (ash n -3)))]
|
|
[(7) (box (consup1 (ash n -3)))])]))
|
|
(define (consup3 n)
|
|
(case n
|
|
[(0) 'a]
|
|
[(1) '()]
|
|
[(2) 3.416]
|
|
[(3) 3/4]
|
|
[else
|
|
(case (logand n 7)
|
|
[(0) (cons (consup3 (ash n -3)) (consup3 (ash n -3)))]
|
|
[(1) (let ([x (make-vector 10 (consup3 (ash n -3)))])
|
|
(vector-set! x 5 (consup3 (ash n -3)))
|
|
x)]
|
|
[(2) (let ([x (cons #f (consup3 (ash n -3)))]) (set-car! x x) x)]
|
|
[(3) (let ([x (consup3 (ash n -3))]) (vector x 'a x))]
|
|
[(4) (let ([x (consup3 (ash n -3))]) (cons x x))]
|
|
[(5) (cons (string-copy "hello") (consup3 (ash n -3)))]
|
|
[(6) (list (consup3 (ash n -3)))]
|
|
[(7) (box (consup3 (ash n -3)))])]))
|
|
(let loop ([n 10000])
|
|
(unless (fx= n 0)
|
|
(let ([rn (random (ash 1 50))])
|
|
(let ([x1 (consup1 rn)] [x2 (consup2 rn)] [x3 (consup3 rn)])
|
|
(define-syntax test
|
|
(syntax-rules ()
|
|
[(_ e) (unless e (errorf #f "~s failed for rn = ~s" 'e rn))]))
|
|
(test (equal? x1 x1))
|
|
(test (equal? x2 x2))
|
|
(test (equal? x3 x3))
|
|
(test (equal? x1 x2))
|
|
(test (equal? x2 x1))
|
|
(test (not (equal? x1 x3)))
|
|
(test (not (equal? x3 x1)))
|
|
(test (not (equal? x2 x3)))
|
|
(test (not (equal? x3 x2)))))
|
|
(loop (fx- n 1))))
|
|
#t))
|
|
|
|
(time
|
|
(let () ; w/o sharing
|
|
(define (consup1 n)
|
|
(case n
|
|
[(0) '(#() 1389222281905413113340958870929048921229855260389703462234642106526635063669)]
|
|
[(1) '#(a #vfx(3 4 5))]
|
|
[(2) '(3/4 . #e3e100+4i)]
|
|
[(3) '(3.416 . -7.5+.05i)]
|
|
[else
|
|
(case (logand n 3)
|
|
[(0) (cons (consup1 (ash n -2)) (consup1 (ash n -3)))]
|
|
[(1) (vector (consup1 (ash n -2)) (consup1 (ash n -3)))]
|
|
[(2) (cons "hello" (consup1 (ash n -2)))]
|
|
[(3) (box (consup2 (ash n -2)))])]))
|
|
(define (consup2 n)
|
|
(case n
|
|
[(0) '(#() 1389222281905413113340958870929048921229855260389703462234642106526635063669)]
|
|
[(1) '#(a #vfx(3 4 5))]
|
|
[(2) '(3/4 . #e3e100+4i)]
|
|
[(3) '(3.416 . -7.5+.05i)]
|
|
[else
|
|
(case (logand n 3)
|
|
[(0) (cons (consup2 (ash n -2)) (consup2 (ash n -3)))]
|
|
[(1) (vector (consup2 (ash n -2)) (consup2 (ash n -3)))]
|
|
[(2) (cons "hello" (consup2 (ash n -2)))]
|
|
[(3) (box (consup1 (ash n -2)))])]))
|
|
(define (consup3 n)
|
|
(case n
|
|
[(0) '(#() 1389222281905413113340958870929048921229855260289703462234642106526635063669)]
|
|
[(1) '#(a #vfx(3 4 6))]
|
|
[(2) '(3/4 . #e3e100+5i)]
|
|
[(3) '(3.417 . -7.5+.05i)]
|
|
[else
|
|
(case (logand n 3)
|
|
[(0) (cons (consup3 (ash n -2)) (consup3 (ash n -3)))]
|
|
[(1) (vector (consup3 (ash n -2)) (consup3 (ash n -3)))]
|
|
[(2) (cons "hello" (consup3 (ash n -2)))]
|
|
[(3) (box (consup3 (ash n -2)))])]))
|
|
(let loop ([n 10000])
|
|
(unless (fx= n 0)
|
|
(let ([rn (random (ash 1 25))])
|
|
(let ([x1 (consup1 rn)] [x2 (consup2 rn)] [x3 (consup3 rn)])
|
|
(define-syntax test
|
|
(syntax-rules ()
|
|
[(_ e) (unless e (errorf #f "~s failed for rn = ~s" 'e rn))]))
|
|
(test (equal? x1 x1))
|
|
(test (equal? x2 x2))
|
|
(test (equal? x3 x3))
|
|
(test (equal? x1 x2))
|
|
(test (equal? x2 x1))
|
|
(test (not (equal? x1 x3)))
|
|
(test (not (equal? x3 x1)))
|
|
(test (not (equal? x2 x3)))
|
|
(test (not (equal? x3 x2)))))
|
|
(loop (fx- n 1))))
|
|
#t))
|
|
|
|
(time
|
|
(let () ; w/sharing
|
|
(define (consup n)
|
|
(define cache
|
|
(let ([ls '()] [n 0] [vk 1000])
|
|
(case-lambda
|
|
[()
|
|
(and (> n 0)
|
|
(let f ([i (random n)] [ls ls])
|
|
(if (fx< i vk)
|
|
(vector-ref (car ls) i)
|
|
(f (fx- i vk) (cdr ls)))))]
|
|
[(x)
|
|
(let ([i (fxmodulo n vk)])
|
|
(if (fx= i 0)
|
|
(set! ls (append ls (list (make-vector vk x))))
|
|
(vector-set! (list-ref ls (fxquotient n vk)) i x)))
|
|
(set! n (fx+ n 1))])))
|
|
(let f ([n n])
|
|
(if (= n 0)
|
|
(or (cache) (cons '() '()))
|
|
(case (logand n 3)
|
|
[(0) (let ([p1 (cons #f #f)] [p2 (cons #f #f)])
|
|
(let ([p (cons p1 p2)])
|
|
(cache p)
|
|
(let ([p (f (ash n -2))])
|
|
(set-car! p1 (car p))
|
|
(set-car! p2 (cdr p)))
|
|
(let ([p (f (ash n -2))])
|
|
(set-cdr! p1 (car p))
|
|
(set-cdr! p2 (cdr p)))
|
|
p))]
|
|
[(1) (let ([m (random 10)])
|
|
(let ([v1 (make-vector m #f)] [v2 (make-vector m #f)])
|
|
(let ([p (cons v1 v2)])
|
|
(cache p)
|
|
(do ([i 0 (fx+ i 1)])
|
|
((fx= i m))
|
|
(let ([p (f (ash n -2))])
|
|
(vector-set! v1 i (car p))
|
|
(vector-set! v2 i (cdr p))))
|
|
p)))]
|
|
[(2) (let ([p1 (f (ash n -2))]
|
|
[p2 (f (ash n -2))])
|
|
(cons (cons (cdr p1) (cdr p2))
|
|
(cons (car p1) (car p2))))]
|
|
[(3) (or (cache) (f (ash n -2)))]))))
|
|
(let loop ([n 5000])
|
|
(unless (fx= n 0)
|
|
(let ([rn (* (random 1000) (expt 2 (random 10)))])
|
|
(let ([p (consup rn)])
|
|
(let ([x1 (car p)] [x2 (cdr p)])
|
|
(define-syntax test
|
|
(syntax-rules ()
|
|
[(_ e) (unless e (errorf #f "~s failed for rn = ~s" 'e rn))]))
|
|
(test (equal? x1 x1))
|
|
(test (equal? x2 x2))
|
|
(test (equal? x1 x2))
|
|
(test (equal? x2 x1)))))
|
|
(loop (fx- n 1))))
|
|
#t))
|
|
|
|
; srfi 85 examples
|
|
(equal? '() '())
|
|
(equal? (vector 34.5 34.5) '#(34.5 34.5))
|
|
(andmap eq?
|
|
(let* ([x (list 'a)] [y (list 'a)] [z (list x y)])
|
|
(list (equal? z (list y x)) (equal? z (list x x))))
|
|
'(#t #t))
|
|
(andmap eq?
|
|
(let ([x (list 'a 'b 'c 'a)]
|
|
[y (list 'a 'b 'c 'a 'b 'c 'a)])
|
|
(set-cdr! (list-tail x 2) x)
|
|
(set-cdr! (list-tail y 5) y)
|
|
(list
|
|
(equal? x x)
|
|
(equal? x y)
|
|
(equal? (list x y 'a) (list y x 'b))))
|
|
'(#t #t #f))
|
|
|
|
; tests that break original SRFI 85 implementation
|
|
(let ()
|
|
(define x
|
|
(let ([x1 (vector 'h)]
|
|
[x2 (let ([x (list #f)]) (set-car! x x) x)])
|
|
(vector x1 (vector 'h) x1 (vector 'h) x1 x2)))
|
|
(define y
|
|
(let ([y1 (vector 'h)]
|
|
[y2 (vector 'h)]
|
|
[y3 (let ([x (list #f)]) (set-car! x x) x)])
|
|
(vector (vector 'h) y1 y1 y2 y2 y3)))
|
|
(equal? x y))
|
|
(let ()
|
|
(define x
|
|
(let ([x0 (vector #f #f #f)]
|
|
[x1 (vector #f #f #f)]
|
|
[x2 (vector #f #f #f)])
|
|
(vector-fill! x0 x0)
|
|
(vector-fill! x1 x1)
|
|
(vector-fill! x2 x2)
|
|
(vector x0 x1 x0 x2 x0)))
|
|
(define y
|
|
(let ([y0 (vector #f #f #f)]
|
|
[y1 (vector #f #f #f)]
|
|
[y2 (vector #f #f #f)])
|
|
(vector-fill! y0 y0)
|
|
(vector-fill! y1 y1)
|
|
(vector-fill! y2 y2)
|
|
(vector y0 y1 y1 y2 y2)))
|
|
(equal? x y))
|
|
(let ()
|
|
(define x
|
|
(let ([x (cons (cons #f 'a) 'a)])
|
|
(set-car! (car x) x)
|
|
x))
|
|
(define y
|
|
(let ([y (cons (cons #f 'a) 'a)])
|
|
(set-car! (car y) (car y))
|
|
y))
|
|
(equal? x y))
|
|
(let ()
|
|
(define x
|
|
(let* ([x3 (cons 'x3 'x3)]
|
|
[x2 (cons 'x2 x3)]
|
|
[x1 (cons x2 'x1)])
|
|
(set-car! x3 x3)
|
|
(set-cdr! x3 x3)
|
|
(set-car! x2 x2)
|
|
(set-cdr! x1 x1)
|
|
x1))
|
|
(define y
|
|
(let* ([y2 (cons 'y1 'y1)]
|
|
[y1 (cons y2 y2)])
|
|
(set-car! y2 y1)
|
|
(set-cdr! y2 y1)
|
|
y1))
|
|
(equal? x y))
|
|
(let ()
|
|
(define x
|
|
(let* ([x3 (cons 'x3 'x3)]
|
|
[x2 (cons 'x2 x3)]
|
|
[x1 (cons x2 'x1)])
|
|
(set-car! x3 x3)
|
|
(set-cdr! x3 x3)
|
|
(set-car! x2 x2)
|
|
(set-cdr! x1 x1)
|
|
x1))
|
|
(define y
|
|
(let* ([y2 (cons 'y1 'y1)]
|
|
[y1 (cons y2 y2)])
|
|
(set-car! y2 y1)
|
|
(set-cdr! y2 y1)
|
|
y1))
|
|
(equal? x y))
|
|
(let ()
|
|
(define (make-x k)
|
|
(let ([x1 (cons
|
|
(let f ([n k])
|
|
(if (= n 0)
|
|
(let ([x0 (cons #f #f)])
|
|
(set-car! x0 x0)
|
|
(set-cdr! x0 x0)
|
|
x0)
|
|
(let ([xi (cons #f (f (- n 1)))])
|
|
(set-car! xi xi)
|
|
xi)))
|
|
#f)])
|
|
(set-cdr! x1 x1)
|
|
x1))
|
|
(define y
|
|
(let* ([y2 (cons #f #f)] [y1 (cons y2 y2)])
|
|
(set-car! y2 y1)
|
|
(set-cdr! y2 y1)
|
|
y1))
|
|
(time (equal? (make-x 100) y)))
|
|
|
|
; tests that stress corrected SRFI 85 implementation
|
|
(or (equal?
|
|
(let ([v1 '#200=(#200#)] [v2 '#201=(#201#)])
|
|
(let ([t0 (current-time 'time-process)])
|
|
(let ([ans (let f ([i 1000] [x #t])
|
|
(if (fx= i 0)
|
|
x
|
|
(f (fx- i 1) (and x (equal? v1 v2)))))])
|
|
(list
|
|
ans
|
|
(let ([t (current-time 'time-process)])
|
|
(< (+ (* (- (time-second t) (time-second t0)) 1000000000)
|
|
(- (time-nanosecond t) (time-nanosecond t0)))
|
|
30000000))))))
|
|
'(#t #t))
|
|
(#%$enable-check-heap))
|
|
|
|
(or (equal?
|
|
(let ([v1 (make-vector 95000 (make-vector 95000 0))]
|
|
[v2 (make-vector 95000 (make-vector 95000 0))])
|
|
(let ([t0 (current-time 'time-process)])
|
|
(let ([ans (equal? v1 v2)])
|
|
(list
|
|
ans
|
|
(let ([t (current-time 'time-process)])
|
|
(> (+ (* (- (time-second t) (time-second t0)) 1000000000)
|
|
(- (time-nanosecond t) (time-nanosecond t0)))
|
|
100000000))))))
|
|
'(#t #f))
|
|
(#%$enable-check-heap))
|
|
|
|
(or (equal?
|
|
(let ([n 100000])
|
|
(let ([f (lambda (n)
|
|
(let ([ls (make-list n 0)])
|
|
(set-cdr! (last-pair ls) ls)
|
|
ls))])
|
|
(let ([v1 (f n)] [v2 (f (- n 1))])
|
|
(let ([t0 (current-time 'time-process)])
|
|
(let ([ans (equal? v1 v2)])
|
|
(let ([t (current-time 'time-process)])
|
|
(list
|
|
ans
|
|
(< (+ (* (- (time-second t) (time-second t0)) 1000000000)
|
|
(- (time-nanosecond t) (time-nanosecond t0)))
|
|
200000000))))))))
|
|
'(#t #t))
|
|
(#%$enable-check-heap))
|
|
)
|
|
|
|
(mat boolean?
|
|
(boolean? #t)
|
|
(boolean? #f)
|
|
(not (boolean? 't))
|
|
(not (boolean? 'f))
|
|
(not (boolean? 'nil))
|
|
(not (boolean? '(a b c)))
|
|
(not (boolean? #\a))
|
|
)
|
|
|
|
(mat null?
|
|
(null? '())
|
|
(not (null? #f))
|
|
(not (null? #t))
|
|
(not (null? 3))
|
|
(not (null? 'a))
|
|
)
|
|
|
|
(mat pair?
|
|
(pair? '(a b c))
|
|
(pair? '(a . b))
|
|
(pair? (cons 3 4))
|
|
(not (pair? '()))
|
|
(not (pair? 3))
|
|
(not (pair? 'a))
|
|
(not (pair? "hi"))
|
|
)
|
|
|
|
(mat list?
|
|
(list? '(a b c))
|
|
(not (list? '(a . b)))
|
|
(not (list? (cons 3 4)))
|
|
(list? '())
|
|
(not (list? 3))
|
|
(not (list? 'a))
|
|
(not (list? "hi"))
|
|
(let ([a (make-list 100)])
|
|
(set-cdr! (last-pair a) a)
|
|
(not (list? a)))
|
|
)
|
|
|
|
(mat atom?
|
|
(not (atom? '(a b c)))
|
|
(not (atom? '(a . b)))
|
|
(not (atom? (cons 3 4)))
|
|
(atom? '())
|
|
(atom? 3)
|
|
(atom? 'a)
|
|
(atom? "hi")
|
|
)
|
|
|
|
(mat number?
|
|
(number? 3)
|
|
(number? 23048230482304)
|
|
(number? 203480234802384/23049821)
|
|
(number? -3/4)
|
|
(number? -1)
|
|
(number? 0)
|
|
(number? -12083)
|
|
(number? 3.5)
|
|
(number? 1.8e-10)
|
|
(number? -3e5)
|
|
(number? -1231.2344)
|
|
(not (number? 'a))
|
|
(not (number? "hi"))
|
|
(not (number? (cons 3 4)))
|
|
(number? 5.0-0.0i)
|
|
(number? 5.0+0.0i)
|
|
(number? 5.0+4.0i)
|
|
(number? +inf.0)
|
|
(number? -inf.0)
|
|
(number? +nan.0)
|
|
)
|
|
|
|
(mat complex?
|
|
(complex? 3)
|
|
(complex? 23048230482304)
|
|
(complex? 203480234802384/23049821)
|
|
(complex? -3/4)
|
|
(complex? -1)
|
|
(complex? 0)
|
|
(complex? -12083)
|
|
(complex? 3.5)
|
|
(complex? 1.8e-10)
|
|
(complex? -3e5)
|
|
(complex? -1231.2344)
|
|
(not (complex? 'a))
|
|
(not (complex? "hi"))
|
|
(not (complex? (cons 3 4)))
|
|
(complex? 5.0-0.0i)
|
|
(complex? 5.0+0.0i)
|
|
(complex? 5.0+4.0i)
|
|
(complex? +inf.0)
|
|
(complex? -inf.0)
|
|
(complex? +nan.0)
|
|
)
|
|
|
|
(mat real?
|
|
(real? 3)
|
|
(real? 23048230482304)
|
|
(real? 203480234802384/23049821)
|
|
(real? -3/4)
|
|
(real? -1)
|
|
(real? 0)
|
|
(real? -12083)
|
|
(real? 3.5)
|
|
(real? 1.8e-10)
|
|
(real? -3e5)
|
|
(real? -1231.2344)
|
|
(not (real? 'a))
|
|
(not (real? "hi"))
|
|
(not (real? (cons 3 4)))
|
|
(not (real? 5.0-0.0i))
|
|
(not (real? 5.0+0.0i))
|
|
(not (real? 5.0+4.0i))
|
|
(real? +inf.0)
|
|
(real? -inf.0)
|
|
(real? +nan.0)
|
|
)
|
|
|
|
(mat real-valued?
|
|
(real-valued? 3)
|
|
(real-valued? 23048230482304)
|
|
(real-valued? 203480234802384/23049821)
|
|
(real-valued? -3/4)
|
|
(real-valued? -1)
|
|
(real-valued? 0)
|
|
(real-valued? -12083)
|
|
(real-valued? 3.5)
|
|
(real-valued? 1.8e-10)
|
|
(real-valued? -3e5)
|
|
(real-valued? -1231.2344)
|
|
(not (real-valued? 'a))
|
|
(not (real-valued? "hi"))
|
|
(not (real-valued? (cons 3 4)))
|
|
(real-valued? 5.0-0.0i)
|
|
(real-valued? 5.0+0.0i)
|
|
(not (real-valued? 8.0+3.0i))
|
|
(real-valued? +inf.0)
|
|
(real-valued? -inf.0)
|
|
(real-valued? +nan.0)
|
|
)
|
|
|
|
(mat rational?
|
|
(rational? 3)
|
|
(rational? 23048230482304)
|
|
(rational? 203480234802384/23049821)
|
|
(rational? -3/4)
|
|
(rational? -1)
|
|
(rational? 0)
|
|
(rational? -12083)
|
|
(rational? 3.5)
|
|
(rational? 1.8e-10)
|
|
(rational? -3e5)
|
|
(rational? -1231.2344)
|
|
(not (rational? 'a))
|
|
(not (rational? "hi"))
|
|
(not (rational? (cons 3 4)))
|
|
(not (rational? 5.0-0.0i))
|
|
(not (rational? 5.0+0.0i))
|
|
(not (rational? 8.0+3.0i))
|
|
(not (rational? +inf.0))
|
|
(not (rational? -inf.0))
|
|
(not (rational? +nan.0))
|
|
)
|
|
|
|
(mat rational-valued?
|
|
(rational-valued? 3)
|
|
(rational-valued? 23048230482304)
|
|
(rational-valued? 203480234802384/23049821)
|
|
(rational-valued? -3/4)
|
|
(rational-valued? -1)
|
|
(rational-valued? 0)
|
|
(rational-valued? -12083)
|
|
(rational-valued? 3.5)
|
|
(rational-valued? 1.8e-10)
|
|
(rational-valued? -3e5)
|
|
(rational-valued? -1231.2344)
|
|
(not (rational-valued? 'a))
|
|
(not (rational-valued? "hi"))
|
|
(not (rational-valued? (cons 3 4)))
|
|
(rational-valued? 5.0-0.0i)
|
|
(rational-valued? 5.0+0.0i)
|
|
(not (rational-valued? 8.0+3.0i))
|
|
(not (rational-valued? +inf.0))
|
|
(not (rational-valued? -inf.0))
|
|
(not (rational-valued? +nan.0))
|
|
(not (rational-valued? +inf.0+0.0i))
|
|
(not (rational-valued? +inf.0-0.0i))
|
|
(not (rational-valued? -inf.0+0.0i))
|
|
(not (rational-valued? -inf.0-0.0i))
|
|
(not (rational-valued? +nan.0+0.0i))
|
|
(not (rational-valued? +nan.0-0.0i))
|
|
)
|
|
|
|
(mat integer?
|
|
(integer? 3)
|
|
(integer? 23048230482304)
|
|
(not (integer? 203480234802384/23049821))
|
|
(not (integer? -3/4))
|
|
(integer? -1)
|
|
(integer? 0)
|
|
(integer? -12083)
|
|
(integer? 4.0)
|
|
(not (integer? 3.5))
|
|
(not (integer? 1.8e-10))
|
|
(integer? 1.8e10)
|
|
(integer? -3e5)
|
|
(not (integer? -1231.2344))
|
|
(not (integer? 'a))
|
|
(not (integer? "hi"))
|
|
(not (integer? (cons 3 4)))
|
|
(not (integer? 3.0-0.0i))
|
|
(not (integer? 3.0+0.0i))
|
|
(not (integer? 3.0+1.0i))
|
|
(integer? #i1)
|
|
(not (integer? +inf.0))
|
|
(not (integer? -inf.0))
|
|
(not (integer? +nan.0))
|
|
)
|
|
|
|
(mat integer-valued?
|
|
(integer-valued? 3)
|
|
(integer-valued? 23048230482304)
|
|
(not (integer-valued? 203480234802384/23049821))
|
|
(not (integer-valued? -3/4))
|
|
(integer-valued? -1)
|
|
(integer-valued? 0)
|
|
(integer-valued? -12083)
|
|
(integer-valued? 4.0)
|
|
(not (integer-valued? 3.5))
|
|
(not (integer-valued? 1.8e-10))
|
|
(integer-valued? 1.8e10)
|
|
(integer-valued? -3e5)
|
|
(not (integer-valued? -1231.2344))
|
|
(not (integer-valued? 'a))
|
|
(not (integer-valued? "hi"))
|
|
(not (integer-valued? (cons 3 4)))
|
|
(integer-valued? 3.0-0.0i)
|
|
(integer-valued? 3.0+0.0i)
|
|
(not (integer-valued? 3.0+1.0i))
|
|
(integer-valued? #i1)
|
|
(not (integer-valued? +inf.0))
|
|
(not (integer-valued? -inf.0))
|
|
(not (integer-valued? +nan.0))
|
|
)
|
|
|
|
(mat char?
|
|
(char? #\a)
|
|
(char? #\3)
|
|
(char? (string-ref "hi" 0))
|
|
(not (char? "a"))
|
|
(not (char? 'a))
|
|
(not (char? '(a b c)))
|
|
)
|
|
|
|
(mat string?
|
|
(string? "hi")
|
|
(string? (string-append "hi " "there"))
|
|
(string? (string #\a #\b #\c #\c))
|
|
(not (string? #\a))
|
|
(not (string? 'a))
|
|
(not (string? '(a b c)))
|
|
(not (string? 3))
|
|
)
|
|
|
|
(mat vector?
|
|
(vector? '#(a b c))
|
|
(vector? (vector 1 2 3 4))
|
|
(not (vector? '(a b c)))
|
|
(not (vector? "hi there"))
|
|
(not (vector? 234234))
|
|
)
|
|
|
|
(mat fxvector?
|
|
(fxvector? #vfx(1 2 3))
|
|
(fxvector? (fxvector 1 2 3 4))
|
|
(not (fxvector? '(1 2 3)))
|
|
(not (fxvector? '#(1 2 3)))
|
|
(not (fxvector? '#vu8(1 2 3)))
|
|
(not (fxvector? "hi there"))
|
|
(not (fxvector? 234234))
|
|
)
|
|
|
|
(mat bytevector?
|
|
(bytevector? '#vu8(1 2 3))
|
|
(bytevector? (bytevector 1 2 3 4))
|
|
(not (bytevector? '(1 2 3)))
|
|
(not (bytevector? '#(1 2 3)))
|
|
(not (bytevector? '#vfx(1 2 3)))
|
|
(not (bytevector? "hi there"))
|
|
(not (bytevector? 234234))
|
|
)
|
|
|
|
(mat symbol?
|
|
(symbol? 'a)
|
|
(symbol? '|(a b c)|)
|
|
(symbol? (string->symbol "hi there"))
|
|
(symbol? (gensym "hi there"))
|
|
(not (symbol? "hi there"))
|
|
(not (symbol? 3))
|
|
)
|
|
|
|
(mat box?
|
|
(box? '#&(a b c))
|
|
(box? (box 3))
|
|
(not (box? '()))
|
|
(not (box? 3))
|
|
(not (box? '(a b c)))
|
|
(not (box? 'a))
|
|
(not (box? "hi"))
|
|
)
|
|
|
|
(mat input-port?
|
|
(input-port? (current-input-port))
|
|
(not (input-port? (open-output-string)))
|
|
)
|
|
|
|
(mat output-port?
|
|
(output-port? (current-output-port))
|
|
(not (output-port? (open-input-string "hello")))
|
|
(output-port? (trace-output-port))
|
|
)
|
|
|
|
(mat procedure?
|
|
(procedure? car)
|
|
(procedure? (lambda (x) x))
|
|
(not (procedure? 3))
|
|
(not (procedure? '#(1 b c)))
|
|
(not (procedure? '(a b c)))
|
|
)
|
|
|
|
(mat boolean=?
|
|
(error? (boolean=?))
|
|
(error? (boolean=? #f))
|
|
(error? (boolean=? 3 #t))
|
|
(error? (boolean=? #t 3))
|
|
(error? (boolean=? 3 #f #t))
|
|
(error? (boolean=? #t 3 #t))
|
|
(error? (boolean=? #t #f 3))
|
|
(error? (boolean=? 3 #t #f #t))
|
|
(error? (boolean=? #f 3 #f #t))
|
|
(error? (boolean=? #t #t 3 #t))
|
|
(error? (boolean=? #f #t #f 3))
|
|
(eqv? (boolean=? #t #t) #t)
|
|
(eqv? (boolean=? #f #t) #f)
|
|
(eqv? (boolean=? #t #f) #f)
|
|
(eqv? (boolean=? #f #f) #t)
|
|
(eqv? (boolean=? #f #f #t) #f)
|
|
(eqv? (boolean=? #f #f #f #f #f #t) #f)
|
|
(eqv? (boolean=? #t #t #t #t #t #f) #f)
|
|
(eqv? (boolean=? #t #t #t #t #t #t) #t)
|
|
(eqv? (boolean=? #f #f #f #f #f #f) #t)
|
|
)
|
|
|
|
(mat symbol=?
|
|
(error? (symbol=?))
|
|
(error? (symbol=? 'f))
|
|
(error? (symbol=? 3 't))
|
|
(error? (symbol=? 't 3))
|
|
(error? (symbol=? 3 'f 't))
|
|
(error? (symbol=? 't 3 't))
|
|
(error? (symbol=? 't 'f 3))
|
|
(error? (symbol=? 3 't 'f 't))
|
|
(error? (symbol=? 'f 3 'f 't))
|
|
(error? (symbol=? 't 't 3 't))
|
|
(error? (symbol=? 'f 't 'f 3))
|
|
(eqv? (symbol=? 't 't) #t)
|
|
(eqv? (symbol=? 'f 't) #f)
|
|
(eqv? (symbol=? 't 'f) #f)
|
|
(eqv? (symbol=? 'f 'f) #t)
|
|
(eqv? (symbol=? 'f 'f 't) #f)
|
|
(eqv? (symbol=? 'f 'f 'f 'f 'f 't) #f)
|
|
(eqv? (symbol=? 't 't 't 't 't 'f) #f)
|
|
(eqv? (symbol=? 't 't 't 't 't 't) #t)
|
|
(eqv? (symbol=? 'f 'f 'f 'f 'f 'f) #t)
|
|
)
|