Gleamには、整数と小数という2種類の数値があります。
整数は、小数点以下のない数値です。
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
小数は、小数点以下に1桁以上の数字がある数値です。
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のコードはモジュールにまとめられており、1つのファイルが1つの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系OSの場合)で定義されたモジュールは、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を手伝うためのコードを書きます。自転車と部品の価格をウェブサイトに正しく表示することを目指して、3つのタスクに取り組みます。
pence_to_pounds関数をエクスポートする同僚がすでにモジュールの骨組みと、未完成のpence_to_pounds関数、pounds_to_string関数を書いています。しかし、pence_to_pounds関数をエクスポートし忘れているため、現時点では他のモジュールやテストスイートからは見えません。
pence_to_pounds関数をエクスポートしてください。
現在、価格はペンスの整数値として保存されています(この自転車店はイギリスにあります)。ウェブサイトでは、価格をポンドで表示したいと考えています。1.00ポンドは100ペンスに相当します。最初のタスクは、pence_to_pounds関数を実装することです。この関数は、ペンスの量をIntで受け取り、それに相当するポンドをFloatとして返します。この関数には型注釈も追加してください。
pence_to_pounds(106)
// -> 1.06
Bettyの自転車はポンドで販売されているので、価格は「£」という記号を付けて表示する必要があります。したがって2つ目のタスクは、pounds_to_string関数を実装することです。この関数は、ポンドの量をFloatで受け取り、先頭にポンド記号を付けた価格をStringとして返します。
gleam/floatモジュールとgleam/stringモジュールは、使用する前にインポートしてください。
pounds_to_stringの型注釈も定義してください。
pounds_to_string(1.06)
// -> "£1.06"