|
|
- ;;
- ;; 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
-
-
-
|