iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

從零開始的 clojure系列 第 8

Day 8 Clojure - Naming Values with def

  • 分享至 

  • xImage
  •  

前言

大家好,我是對於 Clojure 一無所知的菜鳥小白工程師。

今天來學習 def

click Try Clojure to start clojure!

def

當我們在 Clojure 中使用def時,實際上是在將一個名稱與某個值綁定在一起:

(def failed-protagonist-names
  ["Larry Potter" "Doreen the Explorer" "The Incredible Bulk"])

failed-protagonist-names
; => ["Larry Potter" "Doreen the Explorer" "The Incredible Bulk"]

在這個例子中,我們正在將名稱 failed-protagonist-names 綁定(binding)到一個包含三個字串的向量(Vectors)上。

Vectors - 向量,將於之後的章節學習。

值得注意的是,我們使用了 綁定 (binding) 這個術語,而在其他程式語言中,大家可能會說正在 分配 (assign) 一個值給一個 變數 (variable)。

其他語言通常可以多次對同一個變數進行分配。

舉個例子,在 Ruby 中,我們可能會多次對一個變數進行分配:

# ruby
severity = :mild
error_message = "OH GOD! IT'S A DISASTER! WE'RE "

if severity == :mild
  error_message = error_message + "MILDLY INCONVENIENCED!"
else
  error_message = error_message + "DOOOOOOOMED!"
end

我們也來嘗試在 Clojure 中做類似的事情:

(def severity :mild)
(def error-message "OH GOD! IT'S A DISASTER! WE'RE ")
(if (= severity :mild)
  (def error-message (str error-message "MILDLY INCONVENIENCED!"))
  (def error-message (str error-message "DOOOOOOOMED!")))

然而,像這樣改變與名稱相關聯的值,可能會使我們更難理解程式的行為,因為更難知道哪個值與名稱相關聯或為什麼該值可能已經變更。

隨著我們學習 Clojure,會發現我們很少需要更改名稱/值的關聯。

以下是我們可以編寫前面程式碼的一種方式:

(defn error-message
  [severity]
  (str "OH GOD! IT'S A DISASTER! WE'RE "
       (if (= severity :mild)
         "MILDLY INCONVENIENCED!"
         "DOOOOOOOMED!")))

(error-message :mild)
; => "OH GOD! IT'S A DISASTER! WE'RE MILDLY INCONVENIENCED!"

在這裡,我們創建了一個名為error-message的函數,它接受一個名為severity的參數,並根據該參數來確定應返回哪個字串。

然後,你使用:mild作為嚴重性參數來呼叫該函數。

與此同時,我們應該將 def 視為定義常數的方式,不要輕易去更改它的值。‘

小結

我們來複習一下今天學到的東西:

  • 在 Clojure 中,必須將 def 視為定義常數(constants),不能視作變數。
  • 在其他程式語言中,可以定義變數(variable),並任意賦值(assign)。唯常數(constants)不能變動。然而在 Clojure 這個 functional language 中,應將所有的賦值(assign),都視為不可變動的常數(constants)。

參考文章


上一篇
Day 7 Clojure - nil, true, false, Truthiness, Equality, and Boolean Expressions
下一篇
Day 9 Clojure - The Immutable for Data Structures
系列文
從零開始的 clojure23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言