iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
自我挑戰組

從零開始的 clojure系列 第 2

Day 2 初識 Clojure

  • 分享至 

  • xImage
  •  

大家好,我是對於 Clojure 一無所知的菜鳥小白工程師。

Clojure 是什麼?

照慣例上維基百科

Clojure  is a dynamic and functional dialect of the Lisp programming language on the Java platform.

翻譯一下:

Clojure 是一種 動態語言,具有 函式程式設計的特性,屬於 Lisp 家族一員的程式語言,並且基於 Java 平台運作。

欸?明明翻成中文了,我卻還是看不懂,只好一個一個解讀了!

dynamic / 動態程式語言

照例上維基百科

In computer science, a dynamic programming language is a class of high-level programming languages, which at runtime execute many common programming behaviours that static programming languages perform during compilation. These behaviors could include an extension of the program, by adding new code, by extending objects and definitions, or by modifying the type system.

就小白的理解, 動態語言的特點,在於變數的使用。

在動態語言中,變數的資料型別是在運行時( runtime)確定的,而不是在編譯時( compile-time)處理的。這代表我們可以在運行時修改變數,而不需要提前聲明其類型。例如,我們可以將一個變數先賦值為整數,然後再賦值為字串,並且不會在此過程中引發錯誤。

另外,內文中有提及,Clojure 是一種 high-level 語言,high-level 是什麼呢?

  • high-level programming languages 高階程式語言,它是與低階程式語言(Low-level programming language)相對的概念。
  • high-level 是指它是一個被高度封裝的語。對人類而言, high-level 的語言較接近人類的語言,比較好理解。 對電腦而言,它被抽象化了,電腦要花比較多時間去處理。
  • high-level 不是指它比較厲害,請注意。

由於小白平常使用的 Ruby 也是高階 / 動態語言,這點感覺很熟悉呢。

(反過來說,在靜態語言中,變數的資料型別必須在編譯時明確聲明,並且無法更改。這代表編譯時就會對類型錯誤進行檢查,並在不符合類型規範的情況下引發錯誤。)

現在我們知道了, Clojure 是一種動態語言,它在使用上比較靈活,不需要提前聲明類型 。但是要等到運行時,才能針對某些錯誤進行偵測。

Functional programming / 函式程式設計語言

照例上維基百科

In computer sciencefunctional programming is a programming paradigm where programs are constructed by applying and composing functions. It is a declarative programming paradigm in which function definitions are trees of expressions that map values to other values, rather than a sequence of imperative statements which update the running state of the program.
In functional programming, functions are treated as first-class citizens, meaning that they can be bound to names (including local identifiers), passed as arguments, and returned from other functions, just as any other data type can. This allows programs to be written in a declarative and composable style, where small functions are combined in a modular manner.

Functional programming 是一種程式設計的概念。

菜鳥小白在找資料時,發現 Functional language 跟 OOP 是完全不同的世界!

小白的理解是,OOP 講求抽象化、封裝,使程式碼易於維護、使用。FP(Functional programming) 則是注重資料本身——強調資料的不可變性、無副作用的特性,並以 Function 為處理資料的基本單位。

關於 Functional programming ,小白主要從維基百科的幾個概念重點做筆記:

  • First-class / 一等公民
    • 函式是一等公民。
    • 函式可以像變數使用,比如進行 賦值 、 傳遞返回
  • higher-order functions / 高階函式
    • 可以把將函式當成 參數 傳入另一個函式。
    • 把傳入的函式傳入後,也可以把函式當作 回傳值返回。
  • pure functions / 純函式
    • Referential Transparency - 傳入相同的 input,永遠會回傳相同的 oput。
    • No Side Effects - 在過程中完全沒有任何副作用( Side Effect ),不被外部環境干擾,也不會干擾外部。
  • Declarative vs Imperative / 聲明式設計 vs 命令式設計
    • Functional programming 是一種偏向聲明式設計的程式語言(即是直接跟程式碼描述 要做什麼,而不是 如何做到)。
    • Declarative: 注重描述要達到的目標(what to do),而不是具體的步驟或操作。
    • Imperative: 注重描述實現目標所需的具體步驟和操作(how to do with control flow)。

Lisp (programming language) / Lisp 語言

照例上維基百科

Lisp (historically LISP, an acronym for lisprocessing) is a family of programming languages with a long history and a distinctive, fully parenthesized prefix notation.

以小白的認知,可以先把 Lisp 家族的語言特性,當作他們對程式處理的特殊方式。LISP 語言用前置表示法,其特點是操作符置於操作數的前面,因此也稱做前綴表示法。(wiki)

比如説在 Clojure 中, 1+1 會寫成 (+ 1 1)

JVM / 基於 Java 平台 運作

照例上維基百科

Clojure runs on the Java platform and as a result, integrates with Java and fully supports calling Java code from Clojure,and Clojure code can be called from Java, too.

簡而言之,Clojure 是一種在 Java 虛擬機(JVM)上運行的語言。這種設計使 Clojure 可以直接利用 Java 生態系統的豐富資源,包括 Java 函數庫和框架。

結語

最後再複習一下:

Clojure 是一種 動態語言,具有 函式程式設計的特性,屬於 Lisp 家族一員的程式語言,並且基於 Java 平台運作。

參考文章


上一篇
Day 1 開賽宣言與規劃
下一篇
Day 3 Clojure Syntax - Forms
系列文
從零開始的 clojure23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言