Skip to content

Commit 6eea554

Browse files
authored
Merge pull request #1271 from lean-ja/Seasawher/issue1270
`private` の例を `protected` のページに置かない
2 parents 7d5e775 + 7d4e329 commit 6eea554

File tree

3 files changed

+29
-13
lines changed

3 files changed

+29
-13
lines changed

LeanByExample/Modifier/Private.lean

+15-10
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,27 @@
11
/- # private
2-
`private` は、その定義があるファイルの中でだけ参照可能になるようにする修飾子です。他のファイルからはアクセス不能になります。
2+
`private` は、その定義があるファイルの中でだけ参照可能になるようにする修飾子です。他のファイルからはアクセス不能になります。不安定なAPIなど、外部に公開したくないものに対して使うのが主な用途です。
33
4-
不安定なAPIなど、外部に公開したくないものに対して使うのが主な用途です。
4+
```admonish warning title="注意"
5+
このページの内容は <i class="fa fa-play"></i> ボタンから Lean 4 Web で実行することができません。
6+
```
7+
8+
たとえば、以下のように書かれているファイル `PrivateLib.lean` があったとしましょう。
9+
10+
{{#include ./PrivateLib.md}}
11+
12+
このとき、モジュール `PrivateLib` を読み込んでいるファイルからは、`protected` で修飾された名前はアクセス可能ですが、`private` で修飾された名前はアクセスできません。
513
-/
6-
import LeanByExample.Modifier.Protected -- protected のページをインポート
7-
import Lean
8-
namespace Private --#
14+
import LeanByExample.Modifier.PrivateLib -- private が使用されているモジュールをインポート
15+
import Lean --#
916

10-
-- protected の項で private を使わずに定義した内容にアクセスできる
17+
-- private を使わずに定義した内容にはアクセスできる
1118
#check Point.sub
1219

1320
-- private とマークした定義にはアクセスできない
1421
#guard_msgs (drop warning) in --#
1522
#check_failure Point.private_sub
1623

17-
/- なお `private` コマンドで定義した名前は、そのセクションや名前空間を出てもアクセスすることができます。-/
24+
/- なお `private` コマンドで定義した名前は、同じファイル内であればそのセクションや名前空間を出てもアクセスすることができます。-/
1825

1926
namespace Hoge
2027
section
@@ -29,7 +36,7 @@ open Hoge
2936
-- 外からでもアクセスできる
3037
#check addOne
3138

32-
/- ## 補足
39+
/- ## 舞台裏
3340
`private` コマンドを用いて宣言した名前は、そのファイルの外部からはアクセス不能になるものの、そのファイル内部からは一見 `private` でない名前と同様に見えます。しかし、特定の名前が `private` であるか判定する関数は存在します。
3441
-/
3542

@@ -43,5 +50,3 @@ def foo := "world"
4350
#guard Lean.isPrivateName ``hoge
4451

4552
#guard Lean.isPrivateName ``foo = false
46-
47-
end Private --#
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-- PrivateLib.lean の内容
2+
3+
structure Point where
4+
x : Nat
5+
y : Nat
6+
7+
namespace Point
8+
9+
protected def sub (p q : Point) : Point :=
10+
{ x := p.x - q.x, y := p.y - q.y }
11+
12+
private def private_sub := Point.sub
13+
14+
end Point

LeanByExample/Modifier/Protected.lean

-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@ namespace Point
1212
protected def sub (p q : Point) : Point :=
1313
{ x := p.x - q.x, y := p.y - q.y }
1414

15-
-- private のテスト用の宣言
16-
private def private_sub := Point.sub
17-
1815
-- 名前空間の中にいても、短い名前ではアクセスできない
1916
#guard_msgs (drop warning) in --#
2017
#check_failure sub

0 commit comments

Comments
 (0)