;; Testing read of nil/true/false nil ;=>nil true ;=>true false ;=>false ;; Testing read of numbers 1 ;=>1 7 ;=>7 7 ;=>7 ;; Testing read of symbols + ;=>+ abc ;=>abc abc ;=>abc abc5 ;=>abc5 abc-def ;=>abc-def ;; Testing read of strings "abc" ;=>"abc" "abc" ;=>"abc" "abc (with parens)" ;=>"abc (with parens)" "abc\"def" ;=>"abc\"def" ;;;"abc\ndef" ;;;;=>"abc\ndef" ;; Testing read of lists (+ 1 2) ;=>(+ 1 2) ((3 4)) ;=>((3 4)) (+ 1 (+ 2 3)) ;=>(+ 1 (+ 2 3)) ( + 1 (+ 2 3 ) ) ;=>(+ 1 (+ 2 3)) (* 1 2) ;=>(* 1 2) (** 1 2) ;=>(** 1 2) ;; Test commas as whitespace (1 2, 3,,,,),, ;=>(1 2 3) ;; ;; Testing reader errors ;;; TODO: fix these so they fail correctly (1 2 ; expected ')', got EOF [1 2 ; expected ']', got EOF "abc ; expected '"', got EOF ;; ;; -------- Optional Functionality -------- ;; Testing keywords :kw ;=>:kw (:kw1 :kw2 :kw3) ;=>(:kw1 :kw2 :kw3) ;; Testing read of vectors [+ 1 2] ;=>[+ 1 2] [[3 4]] ;=>[[3 4]] [+ 1 [+ 2 3]] ;=>[+ 1 [+ 2 3]] [ + 1 [+ 2 3 ] ] ;=>[+ 1 [+ 2 3]] ;; Testing read of hash maps {"abc" 1} ;=>{"abc" 1} {"a" {"b" 2}} ;=>{"a" {"b" 2}} {"a" {"b" {"c" 3}}} ;=>{"a" {"b" {"c" 3}}} { "a" {"b" { "cde" 3 } }} ;=>{"a" {"b" {"cde" 3}}} ;=>{:a {:b {:cde 3}}} ;; Testing read of comments ;; whole line comment (not an exception) 1 ; comment after expression ;=>1 1; comment after expression ;=>1 ;; Testing read of quoting '1 ;=>(quote 1) '(1 2 3) ;=>(quote (1 2 3)) `1 ;=>(quasiquote 1) `(1 2 3) ;=>(quasiquote (1 2 3)) ~1 ;=>(unquote 1) ~(1 2 3) ;=>(unquote (1 2 3)) ~@(1 2 3) ;=>(splice-unquote (1 2 3)) ;; Testing read of ^/metadata ^{"a" 1} [1 2 3] ;=>(with-meta [1 2 3] {"a" 1}) ;; Testing read of @/deref @a ;=>(deref a)