章一覧

付録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未完成の名前付きの穴