File tree 3 files changed +29
-13
lines changed
3 files changed +29
-13
lines changed Original file line number Diff line number Diff line change 1
1
/- # private
2
- `private` は、その定義があるファイルの中でだけ参照可能になるようにする修飾子です。他のファイルからはアクセス不能になります。
2
+ `private` は、その定義があるファイルの中でだけ参照可能になるようにする修飾子です。他のファイルからはアクセス不能になります。不安定なAPIなど、外部に公開したくないものに対して使うのが主な用途です。
3
3
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` で修飾された名前はアクセスできません。
5
13
-/
6
- import LeanByExample.Modifier.Protected -- protected のページをインポート
7
- import Lean
8
- namespace Private --#
14
+ import LeanByExample.Modifier.PrivateLib -- private が使用されているモジュールをインポート
15
+ import Lean --#
9
16
10
- -- protected の項で private を使わずに定義した内容にアクセスできる
17
+ -- private を使わずに定義した内容にはアクセスできる
11
18
#check Point.sub
12
19
13
20
-- private とマークした定義にはアクセスできない
14
21
#guard_msgs (drop warning) in --#
15
22
#check_failure Point.private_sub
16
23
17
- /- なお `private` コマンドで定義した名前は、そのセクションや名前空間を出てもアクセスすることができます 。-/
24
+ /- なお `private` コマンドで定義した名前は、同じファイル内であればそのセクションや名前空間を出てもアクセスすることができます 。-/
18
25
19
26
namespace Hoge
20
27
section
@@ -29,7 +36,7 @@ open Hoge
29
36
-- 外からでもアクセスできる
30
37
#check addOne
31
38
32
- /- ## 補足
39
+ /- ## 舞台裏
33
40
`private` コマンドを用いて宣言した名前は、そのファイルの外部からはアクセス不能になるものの、そのファイル内部からは一見 `private` でない名前と同様に見えます。しかし、特定の名前が `private` であるか判定する関数は存在します。
34
41
-/
35
42
@@ -43,5 +50,3 @@ def foo := "world"
43
50
#guard Lean.isPrivateName ``hoge
44
51
45
52
#guard Lean.isPrivateName ``foo = false
46
-
47
- end Private --#
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change @@ -12,9 +12,6 @@ namespace Point
12
12
protected def sub (p q : Point) : Point :=
13
13
{ x := p.x - q.x, y := p.y - q.y }
14
14
15
- -- private のテスト用の宣言
16
- private def private_sub := Point.sub
17
-
18
15
-- 名前空間の中にいても、短い名前ではアクセスできない
19
16
#guard_msgs (drop warning) in -- #
20
17
#check_failure sub
You can’t perform that action at this time.
0 commit comments