Saturday, April 10, 2010

Clojure Is LISP

Clojure 1.1 release candidate is available. clojure.lang.Repl is deprecated. Use clojure.main
cd dev/lib/clojure-1.1.0
java -cp .:clojure.jar:jline-0.9.94.jar jline.ConsoleRunner clojure.main
user=> (def r 5)
#'user/r
user=> r
5
user=> (+ r 3)
8
user=> (def clojure 'lisp)
#'user/clojure
user=> clojure
lisp
user=> (def s [5 6 7])
#'user/s
user=> s
[5 6 7]
user=> (first s)         
5
user=> (rest s) 
(6 7)
user=> (def t {"a" 1 "b" 2 "c" 3})
#'user/t
user=> (get t "a")
1
user=> (first t)
["a" 1]
user=> (def u {:a 1 :b 2 :c 3})   
#'user/u
user=> (get u :a)              
1
user=> (let [x 2] (+ x 8))
10
user=> (new BigDecimal 10)
10M
user=> (new BigDecimal 1) 
1M
user=> (new File "temp.clj")
java.lang.IllegalArgumentException: Unable to resolve classname: File (NO_SOURCE_FILE:61)
user=> (import 'java.io.File)
java.io.File
user=> (new File "temp.clj") 
#<File temp.clj>
user=> (def y ["one" "two"])       
#'user/y
user=> (def z (cons "zero" y))
#'user/z
user=> z
("zero" "one" "two")
user=> (cons "zero" ("one" "two")) 
java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0)
user=> (cons "zero" '("one" "two"))    
("zero" "one" "two")
user=> (nth z 2)
"two"
user=> (new java.util.HashMap {"one" 1 "two" 2 "three" 3})
#
user=> (java.util.HashMap. {"one" 1 "two" 2 "three" 3})
#
(def cars ['Ford 'Chevy 'Dodge])
#'user/cars
user=> (rest cars)
(Chevy Dodge)
user=> (first cars)
Ford
user=> (first (rest cars))
Chevy
user=> (def broken (first (rest cars)))                 
#'user/broken
user=> broken
Chevy
user=> (def cars (cons 'GMC cars))
#'user/cars
user=> cars
(GMC Ford Chevy Dodge)
user=> (def stooges (sorted-set 'larry 'mo 'curly))
#'user/stooges
user=> stooges
#{curly larry mo}
user=> (first stooges)                             
curly
user=> (rest stooges)                              
(larry mo)
user=> (def stooges (sorted-map :a 'larry :b 'mo :c 'curly))
#'user/stooges
user=> (stooges :a)                                         
larry
user=> 

Function Definition

(defn function-name doc-string? attr-map? [parameter-list]
(expressions))
user=> (defn add [a b] (+ a b)) 
#'user/add
user=> (add 1 2)
3
user=> (defn biggerthanabreadbox? [thing] (> thing 3))
#'user/biggerthanabreadbox?
user=> (biggerthanabreadbox? 5)                       
true
user=> (biggerthanabreadbox? 1)
false
user=> (defn total-cost [price quantity] 
   (* price quantity)) 
#'user/total-cost
user=> (total-cost 3 2)
6

More Examples

user=> (defstruct book :title :author) 
#'user/book
user=> (def b struct) 
#'user/b
user=> (def b (struct book "Alice in Wonderland" "Lewis Carroll"))
#'user/b
user=> (:title b)
"Alice in Wonderland"
user=> (defmulti prt class)     
#'user/prt
user=> (defmethod prt String [s]
(.write *out* s))        
#
user=> (prt "Clojure is Cool!")
Clojure is Cool!nil
user=> (derive ::bronze ::basic)
nil
user=> (derive ::silver ::basic) 
nil
user=> (derive ::gold ::premier)
nil
user=> (derive ::platinum ::premier)
nil
user=> (isa? ::bronze ::premier)
false
user=> (isa? ::gold ::premier)  
true