話說...Javascript可說是世界上最多工程師會用的語言!
有超過65%的developers使用
所以,今天就來跟大家比較一下,clojurescript 與最常用的javascript之間的語法相似度及重點
Most used programming languages among developers worldwide as of 2022
Ref
今天會比較的是昨天提到的def / defn 以及匿名函式的寫法:)
如果比較完覺得還蠻好轉換,這樣大家就覺得clojurescript比較好上手了吧~(誘導策略!)
| Javascript | Clojurescript | 
|---|---|
| var x = 1; | (def x 1) | 
定義變數乍看之下是很容易理解的事,
在clojure裡form的概念需要特別釐清。我們會解讀def是一個special form,作用是把目前namespace下的某個symbol(x)和值value(1)關聯起來,也可以說,special forms are forms evaluated in a special way。
除了def,在clojure裡,special form還有很多種,可以透過以下(pprint (keys (. clojure.lang.Compiler specials)))指令查詢:
tutorial.core=> (pprint (keys (. clojure.lang.Compiler specials)))
(&
 monitor-exit
 case*
 try
 reify*
 finally
 loop*
 do
 letfn*
 if
 clojure.core/import*
 new
 deftype*
 let*
 fn*
 recur
 set!
 .
 var
 quote
 catch
 throw
 monitor-enter
 def)
nil
那什麼是form呢?最簡單的例子,最小也最常拿來舉例的運算式 (+ 1 2),運算元+就是個form

Ref:
https://livebook.manning.com/concept/clojure/form
https://en.wikibooks.org/wiki/Learning_Clojure/Special_Forms
昨天我們學習了clojure裡定義function的寫法
(defn x [a b] (+ a b))
tutorial.core=> (defn x [a b] (+ a b))
#'tutorial.core/x
tutorial.core=> (x 1 2)
3
javascript會寫成
function x(a, b) {
  return a + b;
}
在chrome瀏覽器的console執行一下結果:

| Javascript | Clojurescript | 
|---|---|
| function x(a, b) { return a + b;} | (defn x [a b] (+ a b)) | 
| 呼叫: x(1, 2) | (x 1 2) | 
有沒有覺得cljs語法稍微簡潔一點呢?
不然也可以來比看看Java vs Clojure差異會更明顯~XD
Java
public void hello(String name) {
    System.out.println("Hello World, " + name);
}
Clojure
(defn hello [name]
  (println "Hello World," name))
在javascript常常使用的匿名函式有一些特點
這些特點也讓javascript成為能學習functional programing (FP)初入門的語言~
| Javascript | Clojurescript | 
|---|---|
| function (x, y){return x + y} | (fn [x y](+ x y)) | 
咦,Clojurescript這讓我們聯想到昨天文章裡看到類似的例子:
(defn a [x y] (+ x y)) 
(def  b (fn [x y] (+ x y)))
def form後面接的是匿名函式(fn [x y] (+ x y)
寫法同等於defn之後,括弧可以少包一層,是不是更方便使用啦?
如果想知道更多javascript轉換成clojurescript之後更簡潔的寫法,也可以參考https://roman01la.github.io/javascript-to-clojurescript/這個大大做的網站唷
下篇預計會講data structure的collection系列
包含 Vectors / Lists / Maps / Sets
today's content inspired by these articles: