付録A 構文早見表
迷ったときのための、小さなリファレンスです。
A.1 変数・関数・分岐
ap-a1.taut
let x: i64 := 10
var y: i64 := 1
y := y + 1
fn add(a: i64, b: i64): i64 { a + b }
let larger := if x > y { x } else { y }
perform show("larger", larger)
実行結果
・ add larger = 10
A.2 型とデータ
ap-a2.taut
shared struct Pair2(A: Shared, B: Shared) { first: A, second: B }
shared enum Choice(A: Shared) { None2, Some2(A) }
let p := Pair2 { first: 3, second: "ok" }
perform show("first", p.first)
実行結果
first = 3
関数の型パラメータは <A>、型宣言のパラメータと型の適用は Pair2(A: Shared, B: Shared)、Choice(i64) のように丸括弧です。Shared は複製できる値を受け取る制約です。
A.3 所有権・借用
ap-a3.taut
import std::prelude::Affine
fn read(&v: Vec(i64)): u64 { Vec::len(&v) }
fn write(&mut v: Vec(i64)): () {
Vec::push(&mut v, 1)
}
var v := Vec::new()
write(&mut v)
perform show("n", read(&v))
実行結果
・ read ・ write n = 1
| 記法 | 説明 |
|---|---|
let x := ... | 値を束縛 |
var x := ... | 変更できるセル |
x := y | セルに代入 |
&x | 読み取りの借用 |
&mut x | 変更の借用 |
let &x := f(&v) | view を束縛 |
copy / shared / affine / linear | 値の使用規則 |
A.4 効果と証明
ap-a4.taut
import std::Base
effect choose(): i64 resume ω
let out := handle { perform choose() } with {
choose(), k => k(1) + k(2)
return v => v
}
perform show("out", out)
theorem id_prop(P: Prop, p: P): P { p }
theorem equal(n: Nat): n = n { Refl }
実行結果
✓ theorem id_prop : ∀ P: Prop. (P) -> P ✓ theorem equal : ∀ n: Nat. n = n out = 3
| 記法 | 説明 |
|---|---|
! {e} | 外側に残る effect |
perform e(...) | effect を要求 |
handle {...} with {...} | effect を処理 |
resume ω | 継続を何度でも再開できる |
Prop | 命題の世界 |
x = y | 等式の命題 |
Refl | 反射律による証明 |
by rewrite!(e) | 等式を使った証明のステップ |
?h | 未完成の名前付きの穴 |