Friday, October 27, 2023

Clojure 取代 if 的技巧 (1) --- fnil

問題:
我們需要對一個 Clojure HashMap hm 裡的某個 path 做操作,插入 val 值。需要滿足的條件為:

  • 如果該 path 為空,就插入空的 vector,並且在該 vector 裡插入 val 
  • 如果該 path 已經有一個 vector  ,就把 val 插入 vector 的尾端
直覺的寫法可能是:

(if (nil? (get-in hm path)
    (assoc-in hm path [val])
    (update-in hm path conj val))

但是,這又略顯得重複、冗長

解法:
  • (update hm path (fnil conj []) val)
  • (update-in hm path (fnil conj []) val)