;;
|
|
;; Testing try*/catch*
|
|
|
|
(try* 123 (catch* e 456))
|
|
;=>123
|
|
|
|
(try* (abc 1 2) (catch* exc (prn "exc is:" exc)))
|
|
; "exc is:" "'abc' not found"
|
|
;=>nil
|
|
|
|
;;;TODO: fix so long lines don't trigger ANSI escape codes ;;;(try*
|
|
;;;(try* (throw ["data" "foo"]) (catch* exc (do (prn "exc is:" exc) 7))) ;;;;
|
|
;;;; "exc is:" ["data" "foo"] ;;;;=>7
|
|
;;;;=>7
|
|
|
|
(try* (throw (list 1 2 3)) (catch* exc (do (prn "err:" exc) 7)))
|
|
; "err:" (1 2 3)
|
|
;=>7
|
|
|
|
(try* (throw "my exception") (catch* exc (do (prn "exc:" exc) 7)))
|
|
; "exc:" "my exception"
|
|
;=>7
|
|
|
|
;;; Test that throw is a function:
|
|
(try* (map throw (list 7)) (catch* exc exc))
|
|
;=>7
|
|
|
|
|
|
;;
|
|
;; Testing builtin functions
|
|
|
|
(symbol? 'abc)
|
|
;=>true
|
|
(symbol? "abc")
|
|
;=>false
|
|
|
|
(nil? nil)
|
|
;=>true
|
|
(nil? true)
|
|
;=>false
|
|
|
|
(true? true)
|
|
;=>true
|
|
(true? false)
|
|
;=>false
|
|
(true? true?)
|
|
;=>false
|
|
|
|
(false? false)
|
|
;=>true
|
|
(false? true)
|
|
;=>false
|
|
|
|
;; Testing apply function with core functions
|
|
(apply + (list 2 3))
|
|
;=>5
|
|
(apply + 4 (list 5))
|
|
;=>9
|
|
(apply prn (list 1 2 "3" (list)))
|
|
; 1 2 "3" ()
|
|
(apply prn 1 2 (list "3" (list)))
|
|
; 1 2 "3" ()
|
|
|
|
;; Testing apply function with user functions
|
|
(apply (fn* (a b) (+ a b)) (list 2 3))
|
|
;=>5
|
|
(apply (fn* (a b) (+ a b)) 4 (list 5))
|
|
;=>9
|
|
|
|
;; Testing map function
|
|
(def! nums (list 1 2 3))
|
|
(def! double (fn* (a) (* 2 a)))
|
|
(double 3)
|
|
;=>6
|
|
(map double nums)
|
|
;=>(2 4 6)
|
|
(map (fn* (x) (symbol? x)) (list 1 (symbol "two") "three"))
|
|
;=>(false true false)
|
|
|
|
;;
|
|
;; ------- Optional Functionality ----------
|
|
;; ------- (Needed for self-hosting) -------
|
|
|
|
;; Testing symbol and keyword functions
|
|
(symbol? :abc)
|
|
;=>false
|
|
(symbol? 'abc)
|
|
;=>true
|
|
(symbol? "abc")
|
|
;=>false
|
|
(symbol? (symbol "abc"))
|
|
;=>true
|
|
(keyword? :abc)
|
|
;=>true
|
|
(keyword? 'abc)
|
|
;=>false
|
|
(keyword? "abc")
|
|
;=>false
|
|
(keyword? (keyword "abc"))
|
|
;=>true
|
|
|
|
(symbol "abc")
|
|
;=>abc
|
|
;;;TODO: all implementations should suppport this too
|
|
;;;(keyword :abc)
|
|
;;;;=>:abc
|
|
(keyword "abc")
|
|
;=>:abc
|
|
|
|
;; Testing sequential? function
|
|
|
|
(sequential? (list 1 2 3))
|
|
;=>true
|
|
(sequential? [15])
|
|
;=>true
|
|
(sequential? sequential?)
|
|
;=>false
|
|
(sequential? nil)
|
|
;=>false
|
|
(sequential? "abc")
|
|
;=>false
|
|
|
|
;; Testing apply function with core functions and arguments in vector
|
|
(apply + 4 [5])
|
|
;=>9
|
|
(apply prn 1 2 ["3" 4])
|
|
; 1 2 "3" 4
|
|
;=>nil
|
|
;; Testing apply function with user functions and arguments in vector
|
|
(apply (fn* (a b) (+ a b)) [2 3])
|
|
;=>5
|
|
(apply (fn* (a b) (+ a b)) 4 [5])
|
|
;=>9
|
|
|
|
|
|
;; Testing map function with vectors
|
|
(map (fn* (a) (* 2 a)) [1 2 3])
|
|
;=>(2 4 6)
|
|
|
|
;; Testing vector functions
|
|
|
|
(vector? [10 11])
|
|
;=>true
|
|
(vector? '(12 13))
|
|
;=>false
|
|
(vector 3 4 5)
|
|
;=>[3 4 5]
|
|
|
|
(map? {})
|
|
;=>true
|
|
(map? '())
|
|
;=>false
|
|
(map? [])
|
|
;=>false
|
|
(map? 'abc)
|
|
;=>false
|
|
(map? :abc)
|
|
;=>false
|
|
|
|
;;
|
|
;; Testing hash-maps
|
|
(hash-map "a" 1)
|
|
;=>{"a" 1}
|
|
|
|
{"a" 1}
|
|
;=>{"a" 1}
|
|
|
|
(assoc {} "a" 1)
|
|
;=>{"a" 1}
|
|
|
|
(get (assoc (assoc {"a" 1 } "b" 2) "c" 3) "a")
|
|
;=>1
|
|
|
|
(def! hm1 (hash-map))
|
|
;=>{}
|
|
|
|
(map? hm1)
|
|
;=>true
|
|
(map? 1)
|
|
;=>false
|
|
(map? "abc")
|
|
;=>false
|
|
|
|
(get nil "a")
|
|
;=>nil
|
|
|
|
(get hm1 "a")
|
|
;=>nil
|
|
|
|
(contains? hm1 "a")
|
|
;=>false
|
|
|
|
(def! hm2 (assoc hm1 "a" 1))
|
|
;=>{"a" 1}
|
|
|
|
(get hm1 "a")
|
|
;=>nil
|
|
|
|
(contains? hm1 "a")
|
|
;=>false
|
|
|
|
(get hm2 "a")
|
|
;=>1
|
|
|
|
(contains? hm2 "a")
|
|
;=>true
|
|
|
|
|
|
;;; TODO: fix. Clojure returns nil but this breaks mal impl
|
|
(keys hm1)
|
|
;=>()
|
|
|
|
(keys hm2)
|
|
;=>("a")
|
|
|
|
;;; TODO: fix. Clojure returns nil but this breaks mal impl
|
|
(vals hm1)
|
|
;=>()
|
|
|
|
(vals hm2)
|
|
;=>(1)
|
|
|
|
(count (keys (assoc hm2 "b" 2 "c" 3)))
|
|
;=>3
|
|
|
|
(def! hm3 (assoc hm2 "b" 2))
|
|
(count (keys hm3))
|
|
;=>2
|
|
(count (vals hm3))
|
|
;=>2
|
|
|
|
(dissoc hm3 "a")
|
|
;=>{"b" 2}
|
|
|
|
(dissoc hm3 "a" "b")
|
|
;=>{}
|
|
|
|
(dissoc hm3 "a" "b" "c")
|
|
;=>{}
|
|
|
|
(count (keys hm3))
|
|
;=>2
|
|
|
|
;; Testing keywords as hash-map keys
|
|
(get {:abc 123} :abc)
|
|
;=>123
|
|
(contains? {:abc 123} :abc)
|
|
;=>true
|
|
(contains? {:abcd 123} :abc)
|
|
;=>false
|
|
(assoc {} :bcd 234)
|
|
;=>{:bcd 234}
|
|
(dissoc {:cde 345 :fgh 456} :cde)
|
|
;=>{:fgh 456}
|
|
(keyword? (nth (keys {:abc 123 :def 456}) 0))
|
|
;=>true
|
|
;;; TODO: support : in strings in make impl
|
|
;;;(keyword? (nth (keys {":abc" 123 ":def" 456}) 0))
|
|
;;;;=>false
|
|
(keyword? (nth (vals {"a" :abc "b" :def}) 0))
|
|
;=>true
|
|
|
|
|
|
|