Gleam에는 정수와 실수, 두 가지 종류의 숫자가 있어요.
정수는 소수점이 없는 수예요.
let integer = 3
// -> 3
Gleam에는 정수를 다루는 여러 연산자가 있어요.
1 + 1 // -> 2
5 - 1 // -> 4
5 / 2 // -> 2
3 * 3 // -> 9
5 % 2 // -> 1
2 > 1 // -> True
2 < 1 // -> False
2 >= 1 // -> True
2 <= 1 // -> False
실수는 소수점 뒤에 숫자가 하나 이상 있는 수예요.
let float = 3.45
// -> 3.45
실수에도 전용 연산자가 있어요.
1.0 +. 1.4 // -> 2.4
5.0 -. 1.5 // -> 3.5
5.0 /. 2.0 // -> 2.5
3.0 *. 3.1 // -> 9.3
2.0 >. 1.0 // -> True
2.0 <. 1.0 // -> False
2.0 >=. 1.0 // -> True
2.0 <=. 1.0 // -> False
Gleam 코드는 모듈로 구성되어 있고, 파일 하나가 하나의 Gleam 모듈이에요.
지금까지는 pub fn 문법으로 함수를 작성했는데, 이렇게 정의한 함수는 다른 모듈에서도 공개적으로 사용할 수 있어요. fn으로 정의한 함수는 정의된 모듈 안에서만 쓸 수 있는 비공개 함수라서 다른 모듈에서는 사용할 수 없어요.
// This function is public
pub fn add(x, y) {
x + y
}
// This function is private
fn subtract(x, y) {
x - y
}
Gleam 모듈에는 이름이 있고, 그 이름은 src나 test 디렉터리 안에서의 파일 경로를 바탕으로 정해져요.
예를 들어 src\geometry\rectangle.gleam(Windows)이나 src/geometry/rectangle.gleam(UNIX 계열 운영체제)에 정의된 모듈의 이름은 geometry/rectangle이에요.
다른 모듈에 정의된 함수에 접근할 때는 임포트를 사용해요. 모듈을 임포트하면 그 모듈이 공개한 모든 함수를 사용할 수 있게 되는데, 함수에 접근하는 방식은 모듈을 어떻게 임포트하느냐에 따라 달라져요.
모듈 이름을 앞에 붙이는 임포트가 기본 방식이에요. 이렇게 임포트한 모듈 안의 함수(예를 들어 gleam/list 모듈의 map 함수)는 모듈 이름을 앞에 붙여 접근해요(list.map).
// Import the int module
import gleam/int
pub fn run(x: Int) -> String {
// Use the to_string function from the int module
int.to_string(x)
}
기본적으로 모듈을 가리키는 데 쓰는 이름은 모듈 이름의 마지막 부분이고, 여기서는 int인데, as 키워드를 쓰면 이 이름을 바꿀 수 있어요.
// Import the int module and refer to it as i
import gleam/int as i
pub fn run(x: Int) -> String {
i.to_string(x)
}
이름을 붙이지 않는 임포트를 하면 그 모듈이 공개한 함수에 접두사 없이 바로 접근할 수 있어요.
// Import the to_string function from the int module
import gleam/int.{to_string}
pub fn run(x: Int) -> String {
to_string(x)
}
모듈 이름을 붙이는 임포트가 더 선호되는데, 함수가 어디에서 왔는지 읽는 사람이 더 명확히 알 수 있고 이름 충돌도 피할 수 있기 때문이에요.
Gleam에는 풍부하고 문서가 잘 갖춰진 표준 라이브러리가 있어요. 문서는 hexdocs.pm/gleam_stdlib에서 온라인으로 볼 수 있어요. 이 링크를 어딘가에 저장해 두세요. 정말 자주 쓰게 될 거예요!
대부분의 내장 데이터 타입에는 그 타입을 다루는 함수를 제공하는 모듈이 함께 있어요. 예를 들어 정수를 위한 gleam/int 모듈, 문자열을 위한 gleam/string 모듈, 배열을 위한 gleam/list 모듈 등이 있어요.
이 연습 문제에서는 자전거와 부품을 파는 온라인 상점인 Betty's Bike Shop을 돕기 위한 코드를 작성해요. 웹사이트에서 자전거와 부품 가격을 올바르게 표시하는 것을 목표로 하는 세 가지 작업이 있어요.
pence_to_pounds 함수 내보내기동료가 이미 모듈의 뼈대와 미완성 함수 pence_to_pounds과 pounds_to_string을 작성해 두었어요.
그런데 pence_to_pounds 함수를 내보내는 것을 잊어버려서, 지금은 다른 모듈이나 테스트 스위트에서 이 함수를 볼 수 없어요.
pence_to_pounds 함수를 내보내세요.
현재 가격은 펜스 단위의 정수로 저장되어 있어요 (이 자전거 가게는 영국에 있어요).
웹사이트에서는 가격을 파운드로 보여주고 싶은데, 1.00파운드는 100펜스예요.
첫 번째 작업은 Int 타입의 펜스 금액을 받아 그에 해당하는 파운드를 Float로 변환하는 pence_to_pounds 함수를 구현하는 거예요.
이 함수에는 타입 애너테이션도 추가해야 해요.
pence_to_pounds(106)
// -> 1.06
Betty의 자전거는 파운드로 판매되므로, 가격은 "£" 기호와 함께 표시해야 해요.
따라서 두 번째 작업은 파운드 금액을 Float로 받아, 앞에 파운드 기호를 붙여 표시한 가격을 String으로 반환하는 pounds_to_string 함수를 구현하는 거예요.
gleam/float 모듈과 gleam/string 모듈은 사용하기 전에 임포트해야 해요.
pounds_to_string의 타입 애너테이션도 정의해야 해요.
pounds_to_string(1.06)
// -> "£1.06"
Exercism에 가입하고 Gleam 트랙을 개념 33개연습 문제 122개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.