Gleamの配列は、0個以上の値からなる不変のコレクションです。配列に入る値は、すべて同じ型でなければなりません。配列は不変なので、一度作成した配列の値が後から変わることはありません。配列を変更しているように見える関数や演算子(要素の追加など)も、実際には新しい配列を返します。
配列は次のように定義します。
let empty = []
let singleValue = [5]
let threeValues = ["a", "b", "c"]
配列に要素を追加する最も一般的な方法は、スプレッド構文を使うことです。
let two_to_four = [2, 3, 4]
let one_to_four = [1, ..two_to_four]
// -> [1, 2, 3, 4]
Gleamの標準ライブラリにあるgleam/listモジュールには、配列を扱うための便利な関数がたくさん用意されています。このモジュールはGleamのコードで非常によく使われるので、慣れておくとよいでしょう。
配列パターンを使うと、case式で配列にマッチさせ、含まれている値を変数に代入できます。
pub fn describe(list: List(String)) -> String {
case list {
[] -> "Empty list"
[x] -> "List with one item: " <> x
[x, y] -> "List with two items: " <> x <> " and " <> y
_ -> "List with three or more items"
}
}
長さが正確に一致する配列にマッチさせるだけでなく、スプレッド構文を使えば、少なくとも一定の長さ以上ある配列にもマッチさせられます。
pub fn describe(list: List(String)) -> String {
case list {
[_, _, ..] -> "List with at least two items"
[_] -> "List with one item"
[] -> "Empty list"
}
}
スプレッド構文は、配列の残りの部分を変数に代入するのにも使えます。
pub fn remove_first_item(list: List(String)) -> List(String) {
case list {
// Return the list without the first item
[_, ..rest] -> rest
// There's no first item to remove, return an empty list
_ -> []
}
}
case式では、マッチ対象の型が取りうるすべての値に対してパターンを用意する必要があります。そのため、残りの値を処理するために、最後に破棄パターン(_)がよく使われます。
この演習では、Exercismで学びたいプログラミング言語の配列を管理するコードを書きます。
タスクは6つあり、どれも配列を扱います。
学びたい言語を管理するには、新しい配列を作成する必要があります。新しい空の配列を返すnew_list関数を定義しましょう。
new_list()
// -> []
今、学びたい言語を書き出した紙があります。Gleam、Go、TypeScriptです。この配列を返すexisting_list関数を定義しましょう。
existing_list()
// -> ["Gleam", "Go", "TypeScript"]
Exercismを見て回るうちに、もっと面白い言語が見つかります。そうした言語は配列に追加したくなります。配列の先頭に新しい言語を追加するadd_language関数を実装しましょう。
add_language(["OCaml", "Elixir"], "Scheme")
// -> ["Scheme", "OCaml", "Elixir"]
言語を1つずつ数えるのは面倒です。配列にある言語の数を数えるcount_languages関数を実装しましょう。
count_languages(["jq", "Elm", "Rust", "Kotlin"])
// -> 4
あるとき、配列の順番が実は逆になっていることに気づきます! 配列を逆順にするreverse_list関数を実装しましょう。
reverse_list(["Python", "Julia", "Idris", "COBOL"])
// -> ["COBOL", "Idris", "Julia", "Python"]
どの言語も大好きですが、Gleamは心の中で特別な位置を占めています。それだけに、次の条件を満たす言語の配列には、とてもわくわくします。
言語の配列がわくわくするものかどうかをチェックするexciting_list関数を実装しましょう。
exciting_list(["Lua", "Gleam"])
// -> True