First Clojure example.
;;; Declarations:
(def n 5)
(defn f[x] (+ x 2))
(f n)
;; Same as above
(def f (fn[x] (+ x 2)))
;;; Clojure collections: Lists, vectors, maps
;; A list
(def numbers '(1 3 -6 7 9))
(first numbers)
(rest numbers)
;; A vector
(def myvec [5 8 9 0])
(first myvec)
(rest myvec)
(seq myvec)
;; creating a vector from a list:
(vec numbers)
;; A hashmap (a map)
(def mymap {:a 6 :b "apple" :c [2 3]})
;; :a is a keyword
(:a mymap)
(mymap :b)
(first mymap) ;; note: the order isn't guaranteed
(rest mymap)
(seq mymap)
(keys mymap)
(vals mymap)
;; Adding an element to a collection using conj (returns the same type of collection):
(conj numbers 6)
(conj myvec 6)
(assoc mymap :x 5)
(conj mymap [:x 5])
(assoc mymap :a 1000)
(conj mymap [:a 1000])
;; Adding a collection of elements using into:
(into numbers ["a" "b" "c"])
(into myvec ["a" "b" "c"])
;; into on a map takes a sequence of key/value pairs
(into mymap [["a" "b"] ["c" "d"]])
;; nil
(first '())
;; the rest of an empty sequence is an empty sequence, not nil:
(rest '())
;;nil is not the same as empty sequence:
(= '() nil)
(nil? '())
;; lookup on a map that doesn't have the key returns nil:
(:x mymap)
;; Functions that work on sequences.
;; A collection is first converted to its sequence, and then
;; the function is applied.
(nth numbers 0)
(nth numbers 4)
(nth myvec 0)
(take 2 numbers)
(take 2 myvec)
(drop 2 numbers)
(drop 2 myvec)
(take 2 mymap)
(drop 2 mymap)
;; Clojure predefined higher-order functions (return sequences)
(map (fn [x] (* x 2)) numbers)
;; you can also write this with a function literal:
(map #(* % 2) numbers)
(filter odd? myvec)
(filter #(< % 4) numbers)
(filter #(not (string? (second %))) mymap)
(reduce + numbers)
;; three arguments for reduce; the second one is used as the starting point
(reduce conj [] numbers)
CSci 4651
course web site.