Skip to content

Commit fda4940

Browse files
authored
Merge pull request #313 from lean-ja/Seasawher/issue255
同じファイルの中で,private とマークされた定義とそうでない定義の差をコード上で検出できるか?
2 parents 8cb5143 + d58b417 commit fda4940

File tree

1 file changed

+15
-21
lines changed

1 file changed

+15
-21
lines changed

Examples/Syntax/Private.lean

+15-21
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
44
不安定なAPIなど,外部に公開したくないものに対して使うのが主な用途です.
55
-/
6-
import Examples.Syntax.Protected
7-
import Lean --#
6+
import Examples.Syntax.Protected -- protected のページをインポート
7+
import Lean
8+
namespace Private --#
89

910
-- protected の項で private を使わずに定義した内容にアクセスできる
1011
#check Point.sub
@@ -18,35 +19,28 @@ namespace Hoge
1819
section
1920
-- private とマークした定義
2021
private def addOne (n : Nat) : Nat := n + 1
22+
2123
end
2224
end Hoge
2325

2426
open Hoge
2527

26-
-- アクセスできる
28+
-- 外からでもアクセスできる
2729
#check addOne
2830

29-
/- 以下の例 [^private] のように,変数のスコープを制限するようなセクションの変種を自作することは可能です. -/
31+
/- ## 補足
32+
`private` コマンドを用いて宣言した名前は,そのファイルの外部からはアクセス不能になるものの,そのファイル内部からは一見 `private` でない名前と同様に見えます.しかし,特定の名前が `private` であるか判定する関数は存在します.
33+
-/
3034

31-
open Lean Elab Command
35+
private def hoge := "hello"
3236

33-
elab "private section" ppLine cmd:command* ppLine "end private section": command => do
34-
let old ← get
35-
try
36-
for cmd in cmd do
37-
elabCommandTopLevel cmd
38-
throwAbortCommand
39-
finally
40-
set old
37+
def foo := "world"
4138

42-
private section
43-
def foo := "hello!!"
39+
-- 名前が private かどうか判定する関数
40+
#check (Lean.isPrivateName : Lean.Name → Bool)
4441

45-
-- セクションの中なら当然アクセスできる
46-
#check foo
47-
end private section
42+
#guard Lean.isPrivateName ``hoge
4843

49-
-- `foo` にアクセスできない
50-
#check_failure foo
44+
#guard Lean.isPrivateName ``foo = false
5145

52-
/- [^private]: Alex J. Best さんによる [Zulip Chat/lean4/private section](https://leanprover.zulipchat.com/#narrow/stream/270676-lean4/topic/private.20section/near/418114975) での投稿を元にした例です. -/
46+
end Private --#

0 commit comments

Comments
 (0)