【概要】 本書はNim言語の機能の中でもメタプログラミング・コンパイル時計算について取り扱った技術同人誌です。 衛生性を担保して安全かつ簡単にプログラムを置換できるテンプレート、抽象構文木を操作可能でLispのような表現力を持つマクロ、静的に定まる値に依存できるstatic[T]型に代表される、メタプログラミングとコンパイル時計算の厚いサポートは特筆すべき機能です。 一般的にメタプログラミングは可読性/保守性が低く扱うべきではないと考えられていますが、抽象構文木に対する制約、コンパイルメッセージを十分に記述することで型検査をクリアしつつ簡潔で表現力のあるAPIを持つライブラリやフレームワークを開発できます。 2021年8月にインプレスR&D社から出版した拙著『プログラミングNim』では触れなかったニッチな言語仕様、マクロの組み立て方について一通り説明しています。 なお、本書はNim言語の基礎を一通り理解している読者を想定していますが、Nimの文法は容易で日頃からプログラミングに親しみのある方ならすぐに習得することができます。付録として「Nimクイックツアー」を載せてありますので、もし必要であれば先にそちらからお読みください。 【目次】 第1章 ジェネリクス 1-1. 行列型を定義する 1-1-1. 型クラスの導入 1-1-2. 暗黙のジェネリクス 1-1-3. 配列サイズを定める 1-2. typedesc[T]型 1-2-1. 型クラスとして機能するtypedesc 1-3. ジェネリクスの制限 1-3-1. ジェネリクスにおける限界 1-3-2. static[T]型における型推論の限界 1-4. concept 1-4-1. conceptの修飾子 第2章 テンプレート 2-1. テンプレートの基礎 2-1-1. unlessテンプレートの定義 2-1-2. !=テンプレートの定義 2-2. inlineプラグマとテンプレートの違い 2-3. テンプレート引数の特別な型 2-3-1. untyped型 2-3-2. typed型 2-4. テンプレートの衛生管理 2-4-1. 衛生性 2-4-2. 衛生性を管理する 2-4-3. 衛生性を無視する 2-5. 制限 2-5-1. コンパイル時実行における制限 2-5-2. メソッド呼び出し構文における制限 2-6. 項書き換えマクロ 2-6-1. 行列積の最適化 2-6-2. 引数制約式の導入 2-6-3. 最適化の順序 2-6-4. 引数制約式におけるパターンマッチ演算子 2-6-5. 巻き上げ 第3章 マクロ 3-1. debugマクロの設計 3-1-1. expandMacrosマクロを利用する 3-1-2. NimNodeを操作する 3-1-3. 抽象構文木を文字列に変換する 3-1-4. 複数のNimNodeを受け取る 3-1-5. 受け取るNimNodeを制限する 3-1-6. マクロのオーバーロード 3-2. 抽象構文木の構築 3-2-1. quoteによる構築 3-2-2. parseExpr・parseStmtによる構築 3-2-3. 構築方法によって異なる衛生性 3-2-4. OpenSymChoice 3-3. プラグマとの関係 3-3-1. compileTimeプラグマ 3-3-2. デバッグ出力に関するプラグマ 3-3-3. プラグマを定義する 3.4. case文マクロ 3-4-1. Option型のパターンマッチングの実装 3.5 forループマクロ 3-5-1. forループマクロの構造の観察 3-5-2. 多重ループを簡潔に実装できるマクロの実装 3-5-3. シンボルの実装を取得する 3.6 実用例: プラグインシステムの実装 付録A Nimクイックツアー A-1. Hello World! A-2. 変数定義 A-3. コメント A-4. 条件分岐 A-5. ループ A-6. データ構造 A-7. プロシージャ