コンテンツにスキップ

namespaceopen

namespace は,名前を整理するためのコマンドです. 大きなプロジェクトでは,同じような名前の定義がたくさん出てきます. 名前空間を使うと,Geometry.Point のように,どの分野・モジュールの名前かを明示できます.

namespace Geometry

structure Point where
  x : Int
  y : Int
deriving Repr, DecidableEq

def origin : Point :=
  { x := 0, y := 0 }

def reflectX (p : Point) : Point :=
  { x := p.x, y := -p.y }

example : reflectX origin = origin := by
  rfl

end Geometry

名前空間の外から参照するときは,完全な名前 Geometry.PointGeometry.origin を使います. このファイル全体は namespace Chapter02 の中にあるので,厳密な完全名は Chapter02.Geometry.Point です. ただし,同じ Chapter02 名前空間の中では Geometry.Point と書けます.

example : Geometry.Point :=
  Geometry.origin

example : Geometry.reflectX Geometry.origin = Geometry.origin := by
  rfl

open は,名前空間の中の名前を短く使えるようにするコマンドです. open Geometry と書くと,そのスコープ内では Geometry.PointPointGeometry.originorigin と書けます. ただし,読み手にとって由来が分かりにくくなることもあるので,必要な範囲に限定して使うのがよいです.

section OpenExamples

open Geometry

def reflectedOrigin : Point :=
  reflectX origin

example : reflectedOrigin = origin := by
  rfl

end OpenExamples

namespace ... end は新しい名前空間に入る構文で,そこで定義した名前はその名前空間に属します. 一方,open は既存の名前空間を開いて,名前を短く参照するための構文です. つまり,namespace は名前を作る場所を決め,open は名前を読むときの省略を許す,と考えるとよいです.

演習

namespace を使って,同じ名前の定義が衝突しないことを確認してください.

namespace AExercise
def value : Nat := 10
end AExercise

namespace BExercise
def value : Nat := 20
end BExercise

#check AExercise.value
#check BExercise.value