Skip to content

Commit 3b53acc

Browse files
authored
Merge pull request #1136 from lean-ja/Seasawher/issue1135
Macro 型を紹介する
2 parents 3e4e646 + adf7aa8 commit 3b53acc

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed
+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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)

booksrc/SUMMARY.md

+1
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
- [Char: Unicode 文字](./Reference/Type/Char.md)
105105
- [Float: 浮動小数点数](./Reference/Type/Float.md)
106106
- [List: 連結リスト](./Reference/Type/List.md)
107+
- [Macro: マクロ](./Reference/Type/Macro.md)
107108
- [Prop: 命題全体](./Reference/Type/Prop.md)
108109
- [String: 文字列](./Reference/Type/String.md)
109110
- [Syntax: 具象構文木](./Reference/Type/Syntax.md)

0 commit comments

Comments
 (0)