| import Lean | |
| macro "foo!" x:term:max : term => `($x + 1) | |
| #check foo! 0 | |
| theorem ex1 : foo! 2 = 3 := | |
| rfl | |
| macro "foo!" x:term:max : term => `($x * 2) | |
| #check foo! 1 -- ambiguous | |
| -- macro with higher priority | |
| macro (priority := high) "foo!" x:term:max : term => `($x - 2) | |
| #check foo! 2 | |
| theorem ex2 : foo! 2 = 0 := | |
| rfl | |
| -- Define elaborator with even higher priority | |
| elab (priority := high+1) "foo!" x:term:max : term <= expectedType => | |
| Lean.Elab.Term.elabTerm x expectedType | |
| theorem ex3 : foo! 3 = 3 := | |
| rfl |