學習軌道
/
Clojure
Clojure
/
練習
/
Lucian 的美味千層麵
Lucian 的美味千層麵

Lucian 的美味千層麵

學習練習

簡介

在 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與)之間的所有內容。

說明

在這道練習中,你會寫一些程式碼,幫助你依照最愛的食譜烤出美味的千層麵。

你有四項任務,全都和烤千層麵所花費的時間有關。

1. 定義預期的烘烤時間(分鐘)

定義expected-time變數,用來確認千層麵應該在烤箱裡烤幾分鐘。根據這本食譜,預期的烘烤時間是 40 分鐘:

expected-time
;;=> 40

2. 計算剩餘的烘烤時間(分鐘)

定義remaining-time函式,它接受千層麵已經在烤箱中烘烤的實際分鐘數作為引數,並根據上一項任務算出的預期烘烤時間,回傳千層麵還需要在烤箱裡待幾分鐘。

(remaining-time 30)
;;=> 10

3. 計算準備時間(分鐘)

定義prep-time函式,它接受你加到千層麵裡的層數作為引數,並回傳你準備千層麵花了幾分鐘,假設每一層要花 2 分鐘準備。

(prep-time 2)
;;=> 4

4. 計算總工作時間(分鐘)

定義total-time函式,它接受兩個引數:第一個引數是你加到千層麵裡的層數,第二個引數是千層麵已經在烤箱中烘烤的分鐘數。這個函式應該回傳你烹調千層麵總共花了幾分鐘,也就是準備時間加上千層麵目前在烤箱中烘烤的時間。

(total-time 3 20)
;;=> 26
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Clojure Exercism

準備好開始 Lucian 的美味千層麵 了嗎?

註冊 Exercism,透過 12 個概念105 個練習 和真人引導來學習並精通 Clojure,全部免費。