在 Clojure 中,陣列是一種集合,就像其他語言中的陣列一樣。與 Lisp 家族的其他語言類似,Clojure 使用括號來表示陣列。
Clojure 的陣列可以透過兩種方式建立:用list函式建立陣列,或是對字面值陣列使用quote。
陣列之所以特別,是因為 Clojure 會把它們當成_呼叫_來處理。它期望呼叫以_運算子_開頭,而運算子通常是函式。陣列中其餘的項目則視為_運算元_,也就是會成為該函式的引數。
正因為 Clojure 對陣列有這樣特殊的處理方式,我們無法直接建立陣列的字面值。使用quote或其簡寫'來 quote 一個陣列,表示這個陣列不應該被求值。
和一些現代語言不同,Clojure 的陣列是_異質的_,意思是它們內部可以包含多種型別的項目,例如'(2 "a" "b" 3)。
和其他 Lisp 不同,Clojure 中的空陣列為真,並不等於nil或false。
在這份練習中,你會撰寫程式碼,處理一份你打算在 Exercism 平台上練習的程式語言陣列。
這個練習有六個任務。
在新增語言之前,你需要先建立一個新的陣列。定義一個會回傳空陣列的函式。
(new-list)
;; => ()
當你探索 Exercism 並找到想學習的語言時,你需要能把它們加進陣列。定義一個函式,將新的語言新增到陣列開頭。
(add-language '("Clojurescript") "JavaScript")
;; => '("JavaScript" "Clojurescript")
你會想快速檢查自己剛才新增了哪個語言。定義一個函式,回傳陣列中的第一個語言。
(first-language '("Haskell" "Python"))
;; => "Haskell"
有時候你會改變心意,不想用剛才新增的語言。定義一個函式,從陣列中移除第一個語言。
(remove-language '("Common Lisp" "Racket" "Scheme"))
;; => '("Racket" "Scheme")
一個一個數語言很不方便。定義一個函式來計算陣列中的語言數量。
(count-languages '("C#" "Racket" "Rust" "Ruby"))
;; => 4
定義一個learning-list函式,並在其中使用前面定義過的幾個函式。
建立一個空陣列
新增 2 個程式語言到陣列中。
從陣列中移除 "Lisp",因為你今年可能沒那麼多時間,而且它和 Clojure 相當類似。
再新增 2 個程式語言到陣列中。
回傳語言的總數。提示:結果應該是 3。
(learning-list)
;; => 3