行百里而半九十,鐵人賽完成了2/3啦!
前面我們已經了解不少Clojure的基礎語法和概念~
包含了以下主題:
其實還有一些概念是自己很想在做完研究功課後跟大家聊聊的,
像是:
但是剩下十天左右,是該繼續向前走,從Clojure基礎語法,進階到ClojureScript的小型專案。
希望鐵人賽結束之後,也能維持動力再繼續擴充自己有興趣的主題~
我們知道,
Clojure和Java是後端語言,
ClojureScript和JavaScript是前端語言 (However, Node.js是後端
);
然後雖然工程師都明白,Java和JavaScript完全沒什麼關係 XDDD ?
但
Clojure和ClojureScript則是一體兩面。
Clojure是一個基於Java平台的Functional programming語言
來看一下網路上大大畫的clojure程式complie後的圖 :
之前前面的文章在討論Clojure時,常常看到Java的影子
例如:
OOME
的error msg(iterate inc 5)
=> Error printing return value (OutOfMemoryError) at java.util.Arrays/copyOf (Arrays.java:3332).
Java heap space
java.lang.Long
此類的Java 資料型別Clojure是一個基於Java平台去發展的語言,但當然也有一些Java沒有的優點,例如Immutable Data Structures(不可變的資料結構)。這意味著工程師做操作時不會改變Data Structures裡的值,而回傳的時候會建立加上新的值的Data Structures。
昨天也講到了Clojure鼓勵pure function。function的回傳值只會根據輸入的參數有所變動,跟其他變動完全無關。只要參數一樣,每次的值都會是一樣。所以工程師在測試時不用考慮太多外部可能會造成未知的改變。
此外,我從這篇文章: Clojure Vs. Java: Comparison Guide In 2021還學到一個單字homoiconicity(同像性),是Lisp語言的共同特性,它的設計讓我們很容易進行對sequence的操作,將語言中的所有程式碼當成data來存取以及轉換。
當code被視為資料,會使meta programming變得更加容易。
因為可在運行時code時,存取本身擁有的function和process,並以編程的方式重新設計自己。
ClojureScript是Clojure基於Javascript上的實作,host在Javascript VM上,而且有dependency management。
ClojureScript會被complie成JavaScript,其編譯器可使用 Google Closure Compiler將complie的javascript進行最佳化。
去看ClojureScript doc的文件就會發現ClojureScript和Clojure文件的API超級像, 但其standard library是 Clojure 的子集合(例如常見的clojure.string、clojure.set、clojure.walk、clojure.zip 等)
ClojureScript complier上面沒有javascript的code,它是靠著Clojure编寫,這代表當編譯器運行時需要回到Java VM 上。
我們下一篇會來理解一下,ClojureScript試著去解決Javascript的什麼問題,並且明天就來開起一個clojureScript小專案~
如果想要延伸閱讀ClojureScript和Clojure還有什麼差異,可以看官方文件的說明
ClojureScript也和Clojure一樣支援REPL-driven development(「讀取-求值-輸出」循環;Read-Eval-Print Loop,簡稱REPL)。
我們可以說,之前對Clojure的基礎學習都是為了幫現在開始的ClojureScript做鋪梗~
本系列文之後的javascript文章(理想上的進度)會以 Learn ClojureScript 為主軸,搭配另一個我愛的Clojurescript cheetsheet網頁做介紹。
如果有足夠的篇幅,希望能介紹像是reagent: Minimalistic React for ClojureScript和reframe: a ClojureScript framework for building UI,帶給大家更豐富的內容!