章一覧

値・変数・基本型

数値、文字列、変更可能な状態を扱います。この章のコードは、どれも 1 ファイルで動きます。ファイルを作って、tauto run ファイル名 で実行してください。

3.1 値に名前を付ける

let は値に名前を付けます。var は、内容を更新できるセルを作ります。更新に使う記号は := です。新しい束縛も let x := 値、var x := 値 と書きます。

ch03-let.taut
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浮動小数点数近似誤差を考える必要がある
Booltrue / false条件に使う
Text文字列複製できる共有データ
()単位型特に結果を返さない計算
Never値を持たない型戻らない処理などに使う

i64 と i32 を自動的に混ぜて足すことはしません。実際に試すと、型エラーになります。

ch03-mix-error.taut
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)になります。

ch03-convert.taut
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) を使います。

ch03-arith.taut
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 型です。リテラルには、エスケープが有効な "..." と、エスケープを処理しない '...' があります。

ch03-text.taut
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 してください。