section
section
は、有効範囲を制限するためのコマンドです。以下に挙げるような効果があります。
variable
で定義された引数の有効範囲を制限する。open
で開いた名前空間の有効範囲を制限する。set_option
で設定したオプションの有効範囲を制限する。local
で修飾されたコマンドの有効範囲を制限する。
section
コマンドで開いたセクションは end
で閉じることができますが、end
は省略することもできます。end
を省略した場合はそのファイルの終わりまでが有効範囲となります。
なお以下の例ではセクションの中をインデントしていますが、インデントするのは一般的なコード整形ルールではありません。
以下は variable
の有効範囲を区切る例です。
section
variable (a : Type)
-- 宣言したので有効
#check a
end
-- `section` の外に出ると無効になる
#check_failure a
次は open
の有効範囲を区切る例です。
section
open Classical
-- open されているのでアクセスできる
#check choice
end
-- `end` 以降は無効になる
#check_failure choice
次は set_option
の有効範囲を区切る例です。
section
set_option autoImplicit true
-- α が暗黙引数になる
def nilList : List α := []
end
-- `end` 以降は無効になり、α が未定義だというエラーになる
/-- error: unknown identifier 'α' -/
#guard_msgs in def nilList' : List α := []
次は local
で修飾されたコマンドの有効範囲を区切る例です。
section
-- Nat の inhabited インスタンスを上書きする
local instance : Inhabited Nat := ⟨1⟩
-- 上記のインスタンスが有効
#guard (default : Nat) = 1
end
-- セクションが終わると上記のインスタンスが無効になる
#guard (default : Nat) = 0
また、セクションに名前を付けることもできます。名前を付けた場合は、閉じるときにも名前を指定する必要があります。
section hoge
variable (a : Type)
#check a
end hoge
セクションは入れ子にすることもできます。
section parent
variable (a : Type)
section child
variable (b : Type)
-- 親セクションで定義された引数は子セクション内でも有効
#check a
end child
-- child セクションの外なので無効
#check_failure b
end parent
-- parent セクションの外なので無効
#check_failure a