Wednesday, April 20, 2022

variants

我之前去研究過 monad ,得到的心得是:「這個東西對我沒有什麼啟發性,因為我在 Clojure 裡,用 vector 或是用 map 就可以夾帶一些資訊了。」

然而,前兩天看了一個很久以前的 talk ,它在介紹 variants 這個概念。看完之後,我有了全新的觀點:不是這些 monad, variants 東西對我沒有用,是早就一直在使用了,或是被 library/DSL 半強迫地要我用了…。

https://www.youtube.com/watch?v=ZQkIWWTygio

這邊先做超快速地介紹:

(1) 什麼是 variants ?

[:tag value]

(2) 什麼是 recursive variants?

[:app [:op [:val 15]

               [:val 16]]]

基本上,hiccup 就算是一種 recursive variants。

(3) 誰用了 variants ?

Erlang 使用了 result variant 

Hiccup 也可以視為是使用 variant 

re-frame 也用了

還有很多時候,是該用,而沒有去用,所以就寫出爛 code 了 

Monday, April 11, 2022

Clojure macro 的妙用

何時該使用 Clojure macro 最適當的時機,一直是一個我覺得費解的問題。對我來講,macro 是一種 compiler plugin ,只有在 programming language 這個抽象層明顯不足的時候,才會用到。

終於,我找到了一個我覺得算是頗為合理的應用。在 antizer 這個 library 的 macro 應用,我覺得極為合理。

它應用的邏輯是這樣子:
要在 ClojureScript 使用 react ,比較好用的方式,是要使用 reagent component ,而不是直接使用 react component 。換言之,要先寫一點程式碼,先包一層。然而, Ant react library 裡卻有著大量的 react component 。所以要寫大量重複的程式碼。應用 macro 的話,就可以讓這些大量的程式碼只要寫一遍即可。