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에서 배우고 싶은 프로그래밍 언어 목록을 관리하는 코드를 작성해요.
여섯 개의 과제가 있고, 모두 배열을 다루는 내용이에요.
배우고 싶은 언어를 관리하려면 새 배열을 만들어야 해요. 비어 있는 새 배열을 반환하는 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"]
언어를 하나씩 세는 건 번거로워요. 배열에 있는 언어의 개수를 세는 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
Exercism에 가입하고 Gleam 트랙을 개념 33개연습 문제 122개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.