在 Clojure 中,列表是一种集合,就像其他语言中的列表一样。与 Lisp 家族中的其他语言类似,Clojure 使用圆括号来表示列表。
创建列表有两种方式:可以用list函数创建列表,也可以对一个字面量列表使用quote。
列表之所以特殊,是因为 Clojure 会把它们当作_调用_来处理。它要求调用以一个_运算符_开头,这个运算符通常是一个函数。列表中其余的项则被视为_操作数_,也就是会成为该函数的实参。
Clojure 对列表的这种特殊处理,正是我们无法直接创建列表字面量的原因。使用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