;; ----------------------------------------------------- ;; Testing list functions (list) ;=>() (list? (list)) ;=>true (empty? (list)) ;=>true (empty? (list 1)) ;=>false (list 1 2 3) ;=>(1 2 3) (count (list 1 2 3)) ;=>3 (count (list)) ;=>0 (count nil) ;=>0 (if (> (count (list 1 2 3)) 3) "yes" "no") ;=>"no" (if (>= (count (list 1 2 3)) 3) "yes" "no") ;=>"yes" ;; Testing if form (if true 7 8) ;=>7 (if false 7 8) ;=>8 (if true (+ 1 7) (+ 1 8)) ;=>8 (if false (+ 1 7) (+ 1 8)) ;=>9 (if nil 7 8) ;=>8 (if 0 7 8) ;=>7 (if "" 7 8) ;=>7 (if (list) 7 8) ;=>7 (if (list 1 2 3) 7 8) ;=>7 (= (list) nil) ;=>false ;; Testing 1-way if form (if false (+ 1 7)) ;=>nil (if nil 8 7) ;=>7 (if true (+ 1 7)) ;=>8 ;; Testing basic conditionals (= 2 1) ;=>false (= 1 1) ;=>true (= 1 2) ;=>false (= 1 (+ 1 1)) ;=>false (= 2 (+ 1 1)) ;=>true (= nil 1) ;=>false (= nil nil) ;=>true (> 2 1) ;=>true (> 1 1) ;=>false (> 1 2) ;=>false (>= 2 1) ;=>true (>= 1 1) ;=>true (>= 1 2) ;=>false (< 2 1) ;=>false (< 1 1) ;=>false (< 1 2) ;=>true (<= 2 1) ;=>false (<= 1 1) ;=>true (<= 1 2) ;=>true ;; Testing equality (= 1 1) ;=>true (= 0 0) ;=>true (= 1 0) ;=>false (= "" "") ;=>true (= "abc" "") ;=>false (= "" "abc") ;=>false (= "abc" "def") ;=>false (= (list) (list)) ;=>true (= (list 1 2) (list 1 2)) ;=>true (= (list 1) (list)) ;=>false (= (list) (list 1)) ;=>false (= 0 (list)) ;=>false (= (list) 0) ;=>false (= (list) "") ;=>false (= "" (list)) ;=>false ;; Testing builtin and user defined functions (+ 1 2) ;=>3 ( (fn* (a b) (+ b a)) 3 4) ;=>7 ( (fn* () 4) ) ;=>4 ( (fn* (f x) (f x)) (fn* (a) (+ 1 a)) 7) ;=>8 ;; Testing closures ( ( (fn* (a) (fn* (b) (+ a b))) 5) 7) ;=>12 (def! gen-plus5 (fn* () (fn* (b) (+ 5 b)))) (def! plus5 (gen-plus5)) (plus5 7) ;=>12 (def! gen-plusX (fn* (x) (fn* (b) (+ x b)))) (def! plus7 (gen-plusX 7)) (plus7 8) ;=>15 ;; Testing variable length arguments ( (fn* (& more) (count more)) 1 2 3) ;=>3 ( (fn* (& more) (count more)) 1) ;=>1 ( (fn* (& more) (count more)) ) ;=>0 ( (fn* (a & more) (count more)) 1 2 3) ;=>2 ( (fn* (a & more) (count more)) 1) ;=>0 ;; Testing language defined not function (not false) ;=>true (not true) ;=>false (not "a") ;=>false (not 0) ;=>false ;; Testing do form (do (prn "prn output1")) ; "prn output1" ;=>nil (do (prn "prn output2") 7) ; "prn output2" ;=>7 (do (prn "prn output1") (prn "prn output2") (+ 1 2)) ; "prn output1" ; "prn output2" ;=>3 (do (def! a 6) 7 (+ a 8)) ;=>14 a ;=>6 ;; Testing recursive sumdown function (def! sumdown (fn* (N) (if (> N 0) (+ N (sumdown (- N 1))) 0))) (sumdown 1) ;=>1 (sumdown 2) ;=>3 (sumdown 6) ;=>21 ;; Testing recursive fibonacci function (def! fib (fn* (N) (if (= N 0) 1 (if (= N 1) 1 (+ (fib (- N 1)) (fib (- N 2))))))) (fib 1) ;=>1 (fib 2) ;=>2 (fib 4) ;=>5 (fib 10) ;=>89 ;; ----------------------------------------------------- ;; Testing string quoting "" ;=>"" "abc" ;=>"abc" "abc def" ;=>"abc def" "\"" ;=>"\"" ;; Testing pr-str (pr-str) ;=>"" (pr-str "") ;=>"\"\"" (pr-str "abc") ;=>"\"abc\"" (pr-str "abc def" "ghi jkl") ;=>"\"abc def\" \"ghi jkl\"" (pr-str "\"") ;=>"\"\\\"\"" (pr-str (list 1 2 "abc" "\"") "def") ;=>"(1 2 \"abc\" \"\\\"\") \"def\"" ;; Testing str (str) ;=>"" (str "") ;=>"" (str "abc") ;=>"abc" (str "\"") ;=>"\"" (str 1 "abc" 3) ;=>"1abc3" (str "abc def" "ghi jkl") ;=>"abc defghi jkl" ;;; TODO: get this working properly ;;;(str (list 1 2 "abc" "\"") "def") ;;;;=>"(1 2 \"abc\" \"\\\"\")def" ;; Testing prn (prn) ; ;=>nil (prn "") ; "" ;=>nil (prn "abc") ; "abc" ;=>nil (prn "abc def" "ghi jkl") ; "abc def" "ghi jkl" (prn "\"") ; "\"" ;=>nil (prn (list 1 2 "abc" "\"") "def") ; (1 2 "abc" "\"") "def" ;=>nil ;; Testing println (println) ; ;=>nil (println "") ; ;=>nil (println "abc") ; abc ;=>nil (println "abc def" "ghi jkl") ; abc def ghi jkl (println "\"") ; " ;=>nil (println (list 1 2 "abc" "\"") "def") ; (1 2 abc ") def ;=>nil ;; ;; -------- Optional Functionality -------- ;; Testing keywords (= :abc :abc) ;=>true (= :abc :def) ;=>false (= :abc ":abc") ;=>false ;; Testing vector truthiness (if [] 7 8) ;=>7 ;; Testing vector functions (count [1 2 3]) ;=>3 (empty? [1 2 3]) ;=>false (empty? []) ;=>true (list? [4 5 6]) ;=>false ;; Testing vector equality (= [] (list)) ;=>true (= (list 1 2) [1 2]) ;=>true (= (list 1) []) ;=>false (= [] [1]) ;=>false (= 0 []) ;=>false (= [] 0) ;=>false (= [] "") ;=>false (= "" []) ;=>false ;; Testing vector parameter lists ( (fn* [] 4) ) ;=>4 ( (fn* [f x] (f x)) (fn* [a] (+ 1 a)) 7) ;=>8