はじめに
Curlのマクロの特徴を要約すると、次の3点があげられます。
- ソースコード実行中にマクロを展開
- コンパイル時に評価されるデータ構造や値を使った展開
- 構文解析機能により言語拡張が可能
基礎編では、Curlのマクロの特徴に挙げた1点目と2点目について、サンプルプログラムを用いて説明します。
マクロとは
Curlコンパイラは、ソースコード実行中にマクロを見つけるとマクロをCurlSourceに展開しその後ネイティブコードを生成します。そのため、展開箇所に最も適したコードが生成されるため、処理速度も期待できます。
下図が、マクロのイメージです。
{define-macro public {macro-rei1} {return {expand-template {String "自分でつくれる!Curl言語~マクロを用いた言語カスタマイズ~" } } } }
{value {macro-rei1} }
上記の{macro-rei1}の部分で、{String "自分でつくれる!Curl言語~マクロを用いた言語カスタマイズ~" }が展開されます。
マクロを作成してみよう
それでは、実際にマクロを作成して特徴を見ていきます。今回使用する「Curl v8.0」は、以下からダウンロードが可能です。 インストールに関しては、こちらを参照ください。
まずは、下記のプログラムを見てください。
{define-proc {xfloor dividend:int, divisor:int}:(int, int) def (quotient, remainder ) = {floor dividend, divisor} {return (quotient, remainder)} }
このプロシージャは、引数divisorにゼロが渡ってくると「整数値において、ゼロ値での除法が行われました。」という例外が発生します。例は簡単なものなので通常トレースは入れませんが、複雑な業務APでは、プロシージャの入口・出口・主要箇所にトレースを入れ、デバッグを行います。機能によっては、サービス開始以降もトレースのレベルを下げて必要なトレースを出し続けることもあるでしょう。そんな場合には、マクロが便利です。
それでは次ページより、マクロを使って、xfloorプロシージャの入口で引数の情報、出口で演算結果の情報を出力するプログラムに書き換えます。