値・変数・基本型
数値、文字列、変更可能な状態を扱います。この章のコードは、どれも 1 ファイルで動きます。ファイルを作って、tauto run ファイル名 で実行してください。
3.1 値に名前を付ける
let は値に名前を付けます。var は、内容を更新できるセルを作ります。更新に使う記号は := です。新しい束縛も let x := 値、var x := 値 と書きます。
let a := 10
let b: i64 := 32
perform show("sum", a + b)
var count: i64 := 0
count := count + 1
perform show("count", count)
sum = 42 count = 1
sum = 42
count = 1
let は再代入できません。var は再代入できます。ただし、値の「所有権」の規則は let と var のどちらにも適用されます(第 7 章)。
3.2 型は数の意味を決める
数値型は、意味が明示されています。
| 型 | 内容 | ポイント |
|---|---|---|
i32, i64 | 固定幅の符号付き整数 | 算術オーバーフローは実行時エラー |
u8, u32, u64 | 固定幅の符号なし整数 | 異なる幅の演算を暗黙に変換しない |
Decimal | 正確な十進数 | 金額などの十進計算に向く |
Float | 浮動小数点数 | 近似誤差を考える必要がある |
Bool | true / false | 条件に使う |
Text | 文字列 | 複製できる共有データ |
() | 単位型 | 特に結果を返さない計算 |
Never | 値を持たない型 | 戻らない処理などに使う |
i64 と i32 を自動的に混ぜて足すことはしません。実際に試すと、型エラーになります。
let a: i32 := 1
let b: i64 := 2
perform show("x", a + b)
✗ program error 3:19: `+` of i32 and i64: the operands differ
ch03-mix-error.taut:3:19: type error: `+` of i32 and i64: the operands differ
幅を変えるには、明示的な変換関数 I64::of_i32、I32::of_i64 などを使います。変換先の範囲に入らない値は、黙って丸められることはなく、実行時エラー(the number is too large)になります。
let a: i32 := 1
let b: i64 := 2
perform show("sum", I64::of_i32(a) + b)
perform show("back", I32::of_i64(b))
sum = 3 back = 2
sum = 3
back = 2
3.3 算術演算と比較
整数の割り算に / は使えません。専用の関数 div(a, b) と mod(a, b) を使います。
let a := 7
let b := 3
let product := a * b
let quotient := div(a, b)
let remainder := mod(a, b)
let same := a == b
perform show("p", product)
perform show("q", quotient)
perform show("r", remainder)
perform show("same", same)
p = 21 q = 2 r = 1 same = false
p = 21
q = 2
r = 1
same = false
7 / 2 と書くと、書き方を教えるエラーになります。
type error: integer `/` is a type error: write div(a, b), mod(a, b), or decimal(a) / decimal(b)
ゼロ除算は実行時エラーです。実行前に必ず無害だと保証されるわけではありません。
3.4 文字列
文字列は Text 型です。リテラルには、エスケープが有効な "..." と、エスケープを処理しない '...' があります。
import std::prelude::Shared
let greeting := "こんにちは、Tauto!"
let path := 'C:\Users\example\Documents'
let joined := concat(greeting, " よい一日を")
perform show("文章", joined)
perform show("パス", path)
文章 = "こんにちは、Tauto! よい一日を" パス = "C:\\Users\\example\\Documents"
文章 = "こんにちは、Tauto! よい一日を"
パス = "C:\\Users\\example\\Documents"
show は値を表示用の形で出すので、path の出力ではバックスラッシュがエスケープされて 2 つに見えます。値そのものは C:\Users\example\Documents です。
Text を連結するには、+ ではなく関数 concat を使います。"x" + "y" は +` of Text: not a number という型エラーになります。数値や文字列の操作は、「何をするのかが一つに決まる」ように設計されています。
演習 3.1:二つの整数を let に束縛して、和・差・積をそれぞれ show してください。