在 Clojure 中,把值繫結到名稱的做法稱為 var。頂層(全域)var 類似其他語言裡的常數。
頂層 var 使用def定義:
(def fingers 10)
fingers
;;=> 10
你可以用defn定義接受零個或多個引數的函式。以下是一個會把 2 個數字相加的函式:
(defn add [x y]
(+ x y))
這個函式接受 2 個引數,這些引數放在向量[x y]中,接著是函式的主體,主體可以包含任意數量的運算式。回傳值一律是求值主體中最後一個運算式的結果,也就是(+ x y)。這個運算式是一個代表函式呼叫的陣列。陣列的第一個項目是+函式,它會以接下來的項目x和y作為引數來求值。
上面定義的add函式也是用同樣的方式呼叫:
(add 2 3)
;;=> 5
在 Clojure 中,函式和值都必須先定義才能使用,也就是說,形式一律會依照出現的順序求值。
在 Clojure 中,空白除了排版之外沒有任何意義。
Clojure 的函式和 var 是以命名空間來組織的。命名空間會把相關的功能群組在一起,並使用ns巨集定義:
(ns calculator)
(def pi 3.14)
(defn add [x y]
(+ x y))
Clojure 支援兩種註解。單行註解以;開頭,而comment形式則用來避免求值(comment與)之間的所有內容。
在這道練習中,你會寫一些程式碼,幫助你依照最愛的食譜烤出美味的千層麵。
你有四項任務,全都和烤千層麵所花費的時間有關。
定義expected-time變數,用來確認千層麵應該在烤箱裡烤幾分鐘。根據這本食譜,預期的烘烤時間是 40 分鐘:
expected-time
;;=> 40
定義remaining-time函式,它接受千層麵已經在烤箱中烘烤的實際分鐘數作為引數,並根據上一項任務算出的預期烘烤時間,回傳千層麵還需要在烤箱裡待幾分鐘。
(remaining-time 30)
;;=> 10
定義prep-time函式,它接受你加到千層麵裡的層數作為引數,並回傳你準備千層麵花了幾分鐘,假設每一層要花 2 分鐘準備。
(prep-time 2)
;;=> 4
定義total-time函式,它接受兩個引數:第一個引數是你加到千層麵裡的層數,第二個引數是千層麵已經在烤箱中烘烤的分鐘數。這個函式應該回傳你烹調千層麵總共花了幾分鐘,也就是準備時間加上千層麵目前在烤箱中烘烤的時間。
(total-time 3 20)
;;=> 26