Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tactic hygiene (タクティクにおけるマクロ衛生) の例 #668

Closed
Seasawher opened this issue Aug 23, 2024 · 0 comments · Fixed by #935
Closed

tactic hygiene (タクティクにおけるマクロ衛生) の例 #668

Seasawher opened this issue Aug 23, 2024 · 0 comments · Fixed by #935
Labels
オプション オプション(set_optionの設定項目)

Comments

@Seasawher
Copy link
Member

/- # tactic hygine
タクティクの中で参照されている識別子は、タクティクを宣言するときには、
そのタクティクが使用されたときの環境に何があるかわからないため、
衝突する可能性がある。
-/

/-- exfalso タクティクを真似て自作したタクティク -/
macro "my_exfalso" : tactic => `(tactic| apply False.elim)

namespace Foo

/-- `False.elim` とめっちゃよく似た名前の紛らわしい定理 -/
theorem False.elim : 1 + 1 = 2 := by rfl

set_option linter.unusedVariables false in

example (h : False) : 1 + 1 = 2 := by
  -- 上の紛らわしい定理の方が使われてしまう
  apply False.elim

  done

example (h : False) : 1 + 1 = 2 := by
  -- なんと、タクティクも衛生的になっていて、
  -- (実行した環境ではなくて)宣言した環境における `False.elim` が使われる
  -- (すごい!)
  my_exfalso

  show False
  contradiction

set_option hygiene false in

macro "my_exfalso'" : tactic => `(tactic| apply False.elim)

example (h : False) : 1 + 1 = 2 := by
  -- 衛生的ではないので、上の紛らわしい定理が使われてしまう
  my_exfalso'

  done

end Foo
@Seasawher Seasawher added the オプション オプション(set_optionの設定項目) label Aug 23, 2024
@Seasawher Seasawher changed the title tactic hygine (タクティクにおけるマクロ衛生) の例 tactic hygiene (タクティクにおけるマクロ衛生) の例 Aug 23, 2024
@Seasawher Seasawher modified the milestones: メタプログラミングとタクティク, メタプログラミングとタクティク作成、カスタマイズ Sep 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
オプション オプション(set_optionの設定項目)
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant