Skip to content

Commit 0d1cf11

Browse files
committed
タクティクで参照した識別子に関するマクロ衛生を紹介する
see #668
1 parent acd91f3 commit 0d1cf11

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

Examples/Option/Hygine.lean

+46
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,49 @@ example (P : Prop) : P → P := by
5757
exact h
5858

5959
end --#
60+
/- また、(驚くべきことに)タクティクマクロの中で導入した識別子だけでなく、「参照した」識別子についても Lean が自動的に衝突を回避します。 -/
61+
section --#
62+
63+
/-- exfalso タクティクを真似て自作したタクティク -/
64+
macro "my_exfalso" : tactic => `(tactic| apply False.elim)
65+
66+
namespace Foo
67+
68+
/-- `False.elim` とめっちゃよく似た名前の紛らわしい定理 -/
69+
theorem False.elim : 1 + 1 = 2 := by rfl
70+
71+
example (_h : False) : 1 + 1 = 2 := by
72+
-- 普通に `apply` すると上の紛らわしい定理の方が使われてしまう
73+
apply False.elim
74+
75+
done
76+
77+
example (h : False) : 1 + 1 = 2 := by
78+
-- 実行した環境ではなくて宣言した環境における `False.elim` が使われる。
79+
-- 紛らわしい方の定理は使われない!
80+
my_exfalso
81+
82+
show False
83+
contradiction
84+
85+
end Foo
86+
87+
-- マクロ衛生を保つ機能を無効にする
88+
set_option hygiene false
89+
90+
/-- マクロ衛生が無効になったバージョンの `my_exfalso` -/
91+
macro "my_exfalso'" : tactic => `(tactic| apply False.elim)
92+
93+
namespace Bar
94+
95+
/-- `False.elim` とめっちゃよく似た名前の紛らわしい定理 -/
96+
theorem False.elim : 1 + 1 = 2 := by rfl
97+
98+
example (_h : False) : 1 + 1 = 2 := by
99+
-- 紛らわしい方の `False.elim` が使われてしまう。
100+
my_exfalso'
101+
102+
done
103+
104+
end Bar
105+
end --#

0 commit comments

Comments
 (0)