;; Testing non-macro function
|
|
(not (= 1 1))
|
|
;=>false
|
|
;;; This should fail if it is a macro
|
|
(not (= 1 2))
|
|
;=>true
|
|
|
|
|
|
;; Testing trivial macros
|
|
(defmacro! one (fn* () 1))
|
|
(one)
|
|
;=>1
|
|
(defmacro! two (fn* () 2))
|
|
(two)
|
|
;=>2
|
|
|
|
;; Testing unless macros
|
|
(defmacro! unless (fn* (pred a b) `(if ~pred ~b ~a)))
|
|
(unless false 7 8)
|
|
;=>7
|
|
(unless true 7 8)
|
|
;=>8
|
|
(defmacro! unless2 (fn* (pred a b) `(if (not ~pred) ~a ~b)))
|
|
(unless2 false 7 8)
|
|
;=>7
|
|
(unless2 true 7 8)
|
|
;=>8
|
|
|
|
;; Testing macroexpand
|
|
(macroexpand (unless2 2 3 4))
|
|
;=>(if (not 2) 3 4)
|
|
|
|
|
|
;; Testing nth, first and rest functions
|
|
|
|
(nth '(1) 0)
|
|
;=>1
|
|
(nth '(1 2) 1)
|
|
;=>2
|
|
(def! x "x")
|
|
(def! x (nth '(1 2) 2))
|
|
x
|
|
;=>"x"
|
|
|
|
(first '())
|
|
;=>nil
|
|
(first '(6))
|
|
;=>6
|
|
(first '(7 8 9))
|
|
;=>7
|
|
|
|
(rest '())
|
|
;=>()
|
|
(rest '(6))
|
|
;=>()
|
|
(rest '(7 8 9))
|
|
;=>(8 9)
|
|
|
|
|
|
;; Testing or macro
|
|
(or)
|
|
;=>nil
|
|
(or 1)
|
|
;=>1
|
|
(or 1 2 3 4)
|
|
;=>1
|
|
(or false 2)
|
|
;=>2
|
|
(or false nil 3)
|
|
;=>3
|
|
(or false nil false false nil 4)
|
|
;=>4
|
|
(or false nil 3 false nil 4)
|
|
;=>3
|
|
(or (or false 4))
|
|
;=>4
|
|
|
|
;; Testing cond macro
|
|
|
|
(cond)
|
|
;=>nil
|
|
(cond true 7)
|
|
;=>7
|
|
(cond true 7 true 8)
|
|
;=>7
|
|
(cond false 7 true 8)
|
|
;=>8
|
|
(cond false 7 false 8 "else" 9)
|
|
;=>9
|
|
(cond false 7 (= 2 2) 8 "else" 9)
|
|
;=>8
|
|
(cond false 7 false 8 false 9)
|
|
;=>nil
|
|
|
|
;;
|
|
;; Loading core.mal
|
|
(load-file "../core.mal")
|
|
|
|
;; Testing and macro
|
|
(and)
|
|
;=>true
|
|
(and 1)
|
|
;=>1
|
|
(and 1 2)
|
|
;=>2
|
|
(and 1 2 3)
|
|
;=>3
|
|
(and 1 2 3 4)
|
|
;=>4
|
|
(and 1 2 3 4 false)
|
|
;=>false
|
|
(and 1 2 3 4 false 5)
|
|
;=>false
|
|
|
|
;; Testing -> macro
|
|
|
|
(-> 7)
|
|
;=>7
|
|
(-> (list 7 8 9) first)
|
|
;=>7
|
|
(-> (list 7 8 9) (first))
|
|
;=>7
|
|
(-> (list 7 8 9) first (+ 7))
|
|
;=>14
|
|
(-> (list 7 8 9) rest (rest) first (+ 7))
|
|
;=>16
|
|
|
|
;; Testing EVAL in let*
|
|
|
|
(let* (x (or nil "yes")) x)
|
|
;=>"yes"
|
|
|
|
;;
|
|
;; -------- Optional Functionality --------
|
|
|
|
;; Testing nth, first, rest with vectors
|
|
|
|
(nth [1] 0)
|
|
;=>1
|
|
(nth [1 2] 1)
|
|
;=>2
|
|
(def! x "x")
|
|
(def! x (nth [1 2] 2))
|
|
x
|
|
;=>"x"
|
|
|
|
(first [])
|
|
;=>nil
|
|
(first [10])
|
|
;=>10
|
|
(first [10 11 12])
|
|
;=>10
|
|
(rest [])
|
|
;=>()
|
|
(rest [10])
|
|
;=>()
|
|
(rest [10 11 12])
|
|
;=>(11 12)
|
|
|
|
;; Testing EVAL in vector let*
|
|
|
|
(let* [x (or nil "yes")] x)
|
|
;=>"yes"
|
|
|