section

section は,スコープを区切るためのコマンドです.以下のコマンドのスコープを区切ることができます.

section で開いたスコープは end で閉じることができますが,省略することもでき,その場合はそのファイルの終わりまでがスコープとなります.

なお以下の例ではセクションの中をインデントしていますが,インデントするのは一般的なコード整形ルールではありません.

次は variable のスコープを区切る例です.

section
  variable (a : Type)

  -- 宣言したので有効
  #check a
end

-- `section` の外に出ると無効になる
#check_failure a

次は open のスコープを区切る例です.

section
  open Classical

  -- open されているのでアクセスできる
  #check choice
end

-- スコープが終わると無効になる
#check_failure choice

次は set_option のスコープを区切る例です.

section
  set_option autoImplicit true

  -- α が暗黙引数になる
  def wrap (x : α) : List α := [x]
end

-- スコープが終わると無効になり,α が未定義だというエラーになる
/--
error: unknown identifier 'α'
---
error: unknown identifier 'α'
-/
#guard_msgs in def wrap' (x : α) : List α := [x]

次は local のスコープを区切る例です.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