Clojure let, apply, and multi-arity functions.


;; examples of let:
(let [x 5
      y (+ x 2)]
  [x y])

;; multi-arity functions:
(defn add5
  "add5 adds 5 to the sum of its arguments. Can be called with 0-2 args"
  ([] 5)
  ([x] (+ x 5))
  ([x y] (+ x y 5)))

(add5)
(add5 3)
(add5 3 4)

;; a fucntion that takes any number of arguments:
(defn add5-to-any
  "adds 5 to the sum of its arguments. Can be called with any number of arguments"
  [& args]
  (println args) ;; args is a sequence
  (+ 5 (reduce + args)))

(add5-to-any)
(add5-to-any 3 5 6 1 2)

;; apply is a useful function that allows treating a sequence as
;; separate function arguments

;(+ '(1 2 3)) ;; this is an error since + doesn't work on a sequence
(apply + '(1 2 3))
(apply + 5 '(1 2 3)) ;; it also can take its arguments as a mix of values and sequences

;; rewriting the previous example:
(defn add5-to-any-2
  "adds 5 to the sum of its arguments. Can be called with any number of arguments"
  [& args]
  (apply + 5 args))

(add5-to-any-2)
(add5-to-any-2 3 5 6 1 2)

;; destructuring arguments, pattern-matching:
(defn f
  "illustarting destructuring of a vector"
  [[x & xs]] (str "The first vector item is " x ", the rest are " xs))

(f [2 3 4])

(f []) ;; x and xs are bound to nil, ignored when forming a string

CSci 4651 course web site.