File tree 2 files changed +50
-0
lines changed
LeanByExample/Reference/Type
2 files changed +50
-0
lines changed Original file line number Diff line number Diff line change
1
+ /- # Macro
2
+
3
+ `Lean.Macro` 型の項は、マクロを表現しています。一般のプログラミング言語においてマクロとは構文を構文に変換することですが、Lean の `m : Macro` は、`Syntax → MacroM Syntax` という型の関数そのものです。
4
+
5
+ [ `Syntax` ] (./Syntax.md) 型が Lean の構文木をダイレクトに表していたように、`Macro` 型は Lean のマクロをダイレクトに表しています。
6
+ -/
7
+ import Mathlib.Util.WhatsNew
8
+
9
+ open Lean in
10
+
11
+ /-- `Macro` とは、おおむね `Syntax` から `Syntax` への関数である -/
12
+ example : Macro = (Syntax → MacroM Syntax) := by rfl
13
+
14
+ /- ## Macro 型とマクロの関係
15
+
16
+ ### Macro 型からマクロ
17
+
18
+ 項 `m : Macro` を使ってマクロを定義するには、以下のように `[macro]` 属性を使用します。
19
+ -/
20
+ open Lean
21
+
22
+ /-- `zeroLit` という構文の定義 -/
23
+ syntax (name := zeroLitPar) "zeroLit" : term
24
+
25
+ /-- `zeroLit` という構文を展開するマクロ -/
26
+ def zeroLitExpand : Macro := fun stx =>
27
+ -- `stx : Syntax` に対するパターンマッチで関数を定義できる
28
+ match stx with
29
+ | `(zeroLit) => `(0 )
30
+ | _ => Macro.throwUnsupported
31
+
32
+ -- まだマクロとして登録されていないのでエラーになる
33
+ /--
34
+ error: elaboration function for 'zeroLitPar' has not been implemented
35
+ zeroLit
36
+ -/
37
+ #guard_msgs in #check zeroLit
38
+
39
+ -- マクロとして登録する
40
+ attribute [macro zeroLitPar] zeroLitExpand
41
+
42
+ -- マクロ展開されるので、0 に等しいという結果になる
43
+ #guard zeroLit = 0
44
+
45
+ /- ### macro コマンドから Macro 型
46
+
47
+ 実際に、`macro` コマンドなどでマクロを定義したとき、それが `Macro` 型の項を生成していることを確かめることができます。`whatsnew` コマンドで、特定のコマンドの実行後に新たに生成された識別子の名前をリストアップすることができます。以下の出力の中に `Lean.Macro` 型の項があるはずです。-/
48
+
49
+ whatsnew in macro "oneLit" : term => `(1 )
Original file line number Diff line number Diff line change 104
104
- [ Char: Unicode 文字] ( ./Reference/Type/Char.md )
105
105
- [ Float: 浮動小数点数] ( ./Reference/Type/Float.md )
106
106
- [ List: 連結リスト] ( ./Reference/Type/List.md )
107
+ - [ Macro: マクロ] ( ./Reference/Type/Macro.md )
107
108
- [ Prop: 命題全体] ( ./Reference/Type/Prop.md )
108
109
- [ String: 文字列] ( ./Reference/Type/String.md )
109
110
- [ Syntax: 具象構文木] ( ./Reference/Type/Syntax.md )
You can’t perform that action at this time.
0 commit comments