配列はElixirに組み込まれた基本型のひとつで、角括弧([])で表します。空の配列も作れますし、どんな型の要素でも好きなだけ入れることもできます。たとえば:
empty_list = []
one_item_list = [1]
two_item_list = [1, 2]
multiple_type_list = [1, :pi, 3.14, "four"]
Elixirは配列を連結リストとして実装しています。各ノードは、先頭の要素と、残りのすべての要素を含む別の配列という2つの値を保持します。配列の最初の要素を_先頭_、残りの要素の並びを_末尾_と呼びます。この表記はコードの中でも使えます:
# [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()
# => []
2つの引数(_言語の配列_と_言語_の文字列リテラル)を取るadd/2関数を定義しましょう。与えられた配列の先頭に新しい言語を追加した結果の配列を返すようにします。
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Clojure")
# => ["Clojure"]
language_list = LanguageList.add(language_list, "Haskell")
# => ["Haskell", "Clojure"]
1つの引数(言語の配列)を取る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"]
1つの引数(言語の配列)を取る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"
1つの引数(言語の配列)を取るcount/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
1つの引数(言語の配列)を取るfunctional_list?/1関数を定義しましょう。真偽値を返すようにします。_"Elixir"_が配列に含まれる言語の1つであればtrueを返すようにします。
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Elixir")
# => ["Elixir"]
LanguageList.functional_list?(language_list)
# => true