72 lines
2.0 KiB
Hy
72 lines
2.0 KiB
Hy
;; Copyright 2018 the authors.
|
|
;; This file is part of Hy, which is free software licensed under the Expat
|
|
;; license. See the LICENSE.
|
|
|
|
(defmacro car [x] `(get ~x 0))
|
|
(defmacro cdr [x] `(cut ~x 1))
|
|
|
|
|
|
(defn test-cons-mutability []
|
|
"Test the mutability of conses"
|
|
(setv tree (cons (cons 1 2) (cons 2 3)))
|
|
(setv (car tree) "foo")
|
|
(assert (= tree (cons "foo" (cons 2 3))))
|
|
(setv (cdr tree) "bar")
|
|
(assert (= tree (cons "foo" "bar"))))
|
|
|
|
|
|
(defn test-cons-quoting []
|
|
"Test quoting of conses"
|
|
(assert (= (cons 1 2) (quote (1 . 2))))
|
|
(assert (= (quote foo) (car (quote (foo . bar)))))
|
|
(assert (= (quote bar) (cdr (quote (foo . bar))))))
|
|
|
|
|
|
(defn test-cons-behavior []
|
|
"NATIVE: test the behavior of cons is consistent"
|
|
(defn t= [a b]
|
|
(and (= a b) (= (type a) (type b))))
|
|
(assert (t= (cons 1 2) '(1 . 2)))
|
|
(assert (t= (cons 1 None) '(1)))
|
|
(assert (t= (cons None 2) '(None . 2)))
|
|
(assert (t= (cons 1 []) [1]))
|
|
(setv tree (cons (cons 1 2) (cons 2 3)))
|
|
(assert (t= (car tree) (cons 1 2)))
|
|
(assert (t= (cdr tree) (cons 2 3))))
|
|
|
|
|
|
(defn test-cons-iteration []
|
|
"NATIVE: test the iteration behavior of cons"
|
|
(setv x '(0 1 2 3 4 . 5))
|
|
(setv it (iter x))
|
|
(for* [i (range 6)]
|
|
(assert (= i (next it))))
|
|
(assert
|
|
(= 'success
|
|
(try
|
|
(do
|
|
(next it)
|
|
'failurenext)
|
|
(except [e TypeError] (if (= e.args (, "Iteration on malformed cons"))
|
|
'success
|
|
'failureexc))
|
|
(except [e Exception] 'failureexc2)))))
|
|
|
|
|
|
(defn test-cons? []
|
|
"NATIVE: test behavior of cons?"
|
|
(assert (cons? (cons 1 2)))
|
|
(assert (cons? '(1 . 2)))
|
|
(assert (cons? '(1 2 3 . 4)))
|
|
(assert (cons? (list* 1 2 3)))
|
|
(assert (not (cons? (cons 1 [2]))))
|
|
(assert (not (cons? (list* 1 None)))))
|
|
|
|
|
|
(defn test-list* []
|
|
"NATIVE: test behavior of list*"
|
|
(assert (= 1 (list* 1)))
|
|
(assert (= (cons 1 2) (list* 1 2)))
|
|
(assert (= (cons 1 (cons 2 3)) (list* 1 2 3)))
|
|
(assert (= '(1 2 3 4 . 5) (list* 1 2 3 4 5))))
|