iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0

話說...Javascript可說是世界上最多工程師會用的語言!
有超過65%的developers使用

所以,今天就來跟大家比較一下,clojurescript 與最常用的javascript之間的語法相似度及重點

Most used programming languages among developers worldwide as of 2022
Ref

今天會比較的是昨天提到的def / defn 以及匿名函式的寫法:)

如果比較完覺得還蠻好轉換,這樣大家就覺得clojurescript比較好上手了吧~(誘導策略!)

def / variable 定義變數比一比

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

defn / function 比一比

昨天我們學習了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))

轉成匿名函式(anonymous function)的寫法

在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

references

today's content inspired by these articles:


上一篇
[Day02]踏上Clojure / Clojurescript的旅程 - 學習Clojure語法的勇敢與真實
下一篇
[Day04] Clojure data structure之collection系列(1) Vectors
系列文
後端Developer實戰ClojureScript: Reagent與前端框架 Reframe30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言