数组是 Elixir 语言内置的。它被视为一种基本类型,用方括号表示。数组可以为空,也可以包含任意数量、任意类型的元素。例如:
empty_list = []
one_item_list = [1]
two_item_list = [1, 2]
multiple_type_list = [1, :pi, 3.14, "four"]
Elixir 把数组实现为链表,每个节点存储两个值:第一个元素,以及包含其余所有元素的另一个数组。数组中的第一个元素称为_头_,其余元素组成的数组称为_尾_。我们可以在代码中使用这种表示法:
# [1] represented in [head | tail] notation
[1 | []]
# [1, 2, 3] represented in [head | tail] notation
[1 | [2 | [3 | []]]]
我们可以用 [head | tail] 表示法在数组开头添加元素:
# Suppose
list = [2, 1]
[3, 2, 1] == [3 | list]
# => true
Kernel模块中有好几个用于处理数组的函数,此外还有整个List模块。
# Check if 1 is a member of the list
1 in [1, 2, 3, 4]
# => true
在本练习中,你需要实现一些函数来操作一个编程语言列表。
定义new/0函数,它不接受任何实参,并返回一个空列表。
LanguageList.new()
# => []
定义add/2函数,它接受 2 个实参(一个_语言列表_和一个_语言的_字符串字面量)。它应返回结果列表,其中新语言被添加到给定列表的最前面。
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Clojure")
# => ["Clojure"]
language_list = LanguageList.add(language_list, "Haskell")
# => ["Haskell", "Clojure"]
定义remove/1函数,它接受 1 个实参(一个_语言列表_)。它应返回去掉第一个元素后的列表。假设列表中始终至少有一个元素。
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Clojure")
# => ["Clojure"]
language_list = LanguageList.add(language_list, "Haskell")
# => ["Haskell", "Clojure"]
language_list = LanguageList.remove(language_list)
# => ["Clojure"]
定义first/1函数,它接受 1 个实参(一个_语言列表_)。它应返回列表中的第一个语言。假设列表中始终至少有一个元素。
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Elm")
# => ["Elm"]
language_list = LanguageList.add(language_list, "Prolog")
# => ["Prolog", "Elm"]
LanguageList.first(language_list)
# => "Prolog"
定义count/1函数,它接受 1 个实参(一个_语言列表_)。它应返回列表中语言的数量。
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Elm")
# => ["Elm"]
language_list = LanguageList.add(language_list, "Prolog")
# => ["Prolog", "Elm"]
LanguageList.count(language_list)
# => 2
定义functional_list?/1函数,它接受 1 个实参(一个_语言列表_)。它应返回一个布尔值。如果_"Elixir"_是列表中的语言之一,它应返回 true。
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Elixir")
# => ["Elixir"]
LanguageList.functional_list?(language_list)
# => true