---
# System prepended metadata

title: 16-Macro
tags: [The Racket Guide]

---

---
title: 16-Macro
tags: The Racket Guide
slideOptions:
    theme: white
    slideNumber: 'c/t'
    center: false
    transition: 'none'
    keyboard: true
    width: '93%'
    height: '100%'

---

<style>
/* basic design */
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6,
.reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {
    font-family: 'Meiryo UI', 'Source Sans Pro', Helvetica, sans-serif, 'Helvetica Neue', 'Helvetica', 'Arial', 'Hiragino Sans', 'ヒラギノ角ゴシック', YuGothic, 'Yu Gothic';
    text-align: left;
    line-height: 1.8;
    letter-spacing: normal;
    text-shadow: none;
    word-wrap: break-word;
    color: #444;
}
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5 {font-weight: normal;}, .reveal h6 {font-weight: bold;}
.reveal h1, .reveal h2, .reveal h3 {color: #2980b9;}
.reveal th {background: #DDD;}
.reveal section img {background:none; border:none; box-shadow:none; max-width: 95%; max-height: 95%;}
.reveal blockquote {width: 90%; padding: 0.5vw 3.0vw;}
.reveal table {margin: 1.0vw auto;}
.reveal code {line-height: 1.2;}
.reveal p, .reveal li {padding: 0vw; margin: 0vw;}
.reveal .box {margin: -0.5vw 1.5vw 2.0vw -1.5vw; padding: 0.5vw 1.5vw 0.5vw 1.5vw; background: #EEE; border-radius: 1.5vw;}
/* table design */
.reveal table {background: #f5f5f5;}
.reveal th {background: #444; color: #fff;}
.reveal td {position: relative; transition: all 300ms;}
.reveal tbody:hover td { color: transparent; text-shadow: 0 0 3px #aaa;}
.reveal tbody:hover tr:hover td {color: #444; text-shadow: 0 1px 0 #fff;}
/* blockquote design */
.reveal blockquote {
    width: 90%;
    padding: 0.5vw 0 0.5vw 6.0vw;
    font-style: italic;
    background: #f5f5f5;
}
.reveal blockquote:before{
    position: absolute;
    top: 0.1vw;
    left: 1vw;
    content: "\f10d";
    font-family: FontAwesome;
    color: #2980b9;
    font-size: 3.0vw;
}
/* font size */
.reveal h1 {font-size: 5.0vw;}
.reveal h2 {font-size: 3.0vw;}
.reveal h3 {font-size: 2.8vw;}
.reveal h4 {font-size: 2.6vw;}
.reveal h5 {font-size: 1.8vw;}
.reveal h6 {font-size: 2.2vw;}
.reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {font-size: 2.2vw;}
.reveal code {font-size: 1.6vw;}
/* new color */
.red {color: #EE6557;}
.blue {color: #16A6B6;}
/* split slide */
#right {left: -18.33%; text-align: left; float: left; width: 50%; z-index: -10;}
#left  {left:  31.25%; text-align: left; float: left; width: 50%; z-index: -10;}
</style>

<style>
/* specific design */
.reveal h1 {
    margin: 0% -100%;
    padding: 2% 100% 4% 100%;
	color: #fff;
    background: #fffa5e;  /* fallback for old browsers */
	background: linear-gradient(-45deg, #f7f439, #54ffa4, #23A6D5, #238ed5);
	background-size: 200% 200%;
	animation: Gradient 60s ease infinite;
}
@keyframes Gradient {
	0%   {background-position: 0% 50%}
	50%  {background-position: 100% 50%}
	100% {background-position: 0% 50%}
}
.reveal h2 {
    text-align: center;
    margin: -5% -50% 2% -50%;
    padding: 3% 10% 1% 10%;
    color: #fff;
    background: #fffa5e;  /* fallback for old browsers */
    background: -webkit-linear-gradient(to right, #c74646, #fffa5e);  /* Chrome 10-25, Safari 5.1-6 */
    background: linear-gradient(to right, #c74646, #fffa5e); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
}
.reveal h4 {
    text-align: center;
}
</style>

## Macro

マクロとは、元の形式を既存の形式に拡張する、関連する変換器を持つ構文形式のことです。別の言い方をすると、マクロは Racket コンパイラの拡張機能です。racket/baseやracketの構文形式のほとんどは、実際には、小さなコアコンストラクトのセットに展開するマクロです。

多くの言語と同様に、Racket はパターンベースのマクロを提供しており、簡単な変換を簡単に実装でき、信頼して使用することができます。また、Racket は、Racket または Racket のマクロ拡張バリアントで実装された任意のマクロ変換をサポートしています。

本章では、Racket のマクロについて説明しますが、別の観点からの説明として、「[Fear of Macros](https://www.greghendershott.com/fear-of-macros/)」を参照してください。

Racket には、マクロ開発のための追加サポートがあります。マクロデバッガは、経験豊富なプログラマが自分のマクロをデバッグしたり、初心者がマクロの動作やマクロの研究をしたりするのを容易にします。また、マクロを書いたり、構文を指定するためのsyntax/parseライブラリは、マクロの使用を自動的に検証し、構文エラーを報告します。


* [16.1 パターンベースのマクロ](https://hackmd.io/_F0kpBDORRyB5K1TWszGGg)
    * [16.1.1 define-syntax-rule](https://hackmd.io/_F0kpBDORRyB5K1TWszGGg#1611-define-syntax-rule)
     * [16.1.2 レキシカルスコープ](https://hackmd.io/_F0kpBDORRyB5K1TWszGGg#1612-%E3%83%AC%E3%82%AD%E3%82%B7%E3%82%AB%E3%83%AB%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97)
     * [16.1.3 define-syntaxおよびsyntax-rule](https://hackmd.io/_F0kpBDORRyB5K1TWszGGg#1613-define-syntax-%E5%8F%8A%E3%81%B3-syntax-rule)
     * [16.1.4 一連のマッチング](https://hackmd.io/_F0kpBDORRyB5K1TWszGGg#1614-%E4%B8%80%E9%80%A3%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81%E3%83%B3%E3%82%B0)
     * [16.1.5 識別子マクロ](https://hackmd.io/_F0kpBDORRyB5K1TWszGGg#1615-%E8%AD%98%E5%88%A5%E5%AD%90%E3%83%9E%E3%82%AF%E3%83%AD)
     * [16.1.6 set! 変形機](https://hackmd.io/_F0kpBDORRyB5K1TWszGGg#1616-set-%E5%A4%89%E5%BD%A2%E6%A9%9F)
     * [16.1.7 マクロを生成するマクロ](https://hackmd.io/_F0kpBDORRyB5K1TWszGGg#1617-%E3%83%9E%E3%82%AF%E3%83%AD%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%83%9E%E3%82%AF%E3%83%AD)
     * [16.1.8 拡張例:Call-by-Reference関数](https://hackmd.io/_F0kpBDORRyB5K1TWszGGg#1618-%E6%8B%A1%E5%BC%B5%E4%BE%8BCall-by-Reference%E9%96%A2%E6%95%B0)

* [16.2 一般的なマクロトランスフォーマー](https://hackmd.io/emywOhQeTCOl8BneenyfVQ#162-%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E3%83%9E%E3%82%AF%E3%83%AD%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%BC)
    * [16.2.1 構文オブジェクト](https://hackmd.io/PnldatcwRTKHhcpWum5bBg#1621-%E6%A7%8B%E6%96%87%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)
    * [16.2.2 マクロトランスフォーマ手続き](https://hackmd.io/1lLwBBBIR6C0wpRuqZtOtw)
    * [16.2.3 パターンと表現の混在：syntax-case](https://hackmd.io/AVXmTZ3fRKGcvTnASidqyQ#1623-%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A8%E8%A1%A8%E7%8F%BE%E3%81%AE%E6%B7%B7%E5%9C%A8%EF%BC%9Asyntax-case)
    * [16.2.4 with-syntaxとgenerate-temporaries](https://hackmd.io/DIzp79gETviwu1oC1xiqOg#1624-with-syntax%E3%81%A8generate-temporaries)
    * [16.2.5 コンパイルとランタイムの段階](https://hackmd.io/wRUrzYlXROilIxXRmY6ucg#1625-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%A8%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%81%AE%E6%AE%B5%E9%9A%8E)
    * [16.2.6 一般的なフェーズレベル](https://hackmd.io/kkYlJHOyQ8C1ncqfI60KJQ#1626-%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA%E3%83%AC%E3%83%99%E3%83%AB)
         * [16.2.6.1 フェーズとバインディング](https://hackmd.io/kkYlJHOyQ8C1ncqfI60KJQ#16261-%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA%E3%81%A8%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)
         * [16.2.6.2 フェーズとモジュール](https://hackmd.io/kkYlJHOyQ8C1ncqfI60KJQ#16262-%E3%83%95%E3%82%A7%E3%83%BC%E3%82%BA%E3%81%A8%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)
    * [16.2.7 コードインスペクタと構文汚染](https://hackmd.io/YwkWRz5zRVSloSQTJ5qxFw#1627-%E3%82%B3%E3%83%BC%E3%83%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%9A%E3%82%AF%E3%82%BF%E3%81%A8%E6%A7%8B%E6%96%87%E3%81%AE%E4%B9%B1%E3%82%8C)
        * [16.2.7.1 マクロの結果に対するsyntax-protectの使用](https://hackmd.io/YwkWRz5zRVSloSQTJ5qxFw#16271-%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8Bsyntax-protect%E3%81%AE%E4%BD%BF%E7%94%A8)
        * [16.2.7.2 染色モード](https://hackmd.io/YwkWRz5zRVSloSQTJ5qxFw#16272-%E6%9F%93%E8%89%B2%E3%83%A2%E3%83%BC%E3%83%89)
        * [16.2.7.3 汚れとコードインスペクタ](https://hackmd.io/YwkWRz5zRVSloSQTJ5qxFw#16273-%E6%B1%9A%E3%82%8C%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%9A%E3%82%AF%E3%82%BF)
        * [16.2.7.4 保護されたエクスポート](https://hackmd.io/YwkWRz5zRVSloSQTJ5qxFw#16274-%E4%BF%9D%E8%AD%B7%E3%81%95%E3%82%8C%E3%81%9F%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88)

* [16.3 モジュールのインスタンス化と訪問](https://hackmd.io/Tw7CnxsYQ0SadNkRjqspuw#163-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E5%8C%96%E3%81%A8%E8%A8%AA%E5%95%8F)
     * [16.3.1 宣言とインスタンス化](https://hackmd.io/Tw7CnxsYQ0SadNkRjqspuw#1631-%E5%AE%A3%E8%A8%80%E3%81%A8%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E5%8C%96)
     * [16.3.2 コンパイルタイムでのインスタンス化](https://hackmd.io/Tw7CnxsYQ0SadNkRjqspuw#1632-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%99%82%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E5%8C%96)
     * [16.3.3 モジュールの訪問](https://hackmd.io/Tw7CnxsYQ0SadNkRjqspuw#1633-%E8%A8%AA%E5%95%8F%E3%81%99%E3%82%8B%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)
     * [16.3.4 利用可能なモジュールを介したレイジービジット](https://hackmd.io/Tw7CnxsYQ0SadNkRjqspuw#1634-%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%AA%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E7%B5%8C%E7%94%B1%E3%81%97%E3%81%9F%E9%81%85%E5%BB%B6%E8%A8%AA%E5%95%8F)