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