Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

自分でつくれる!Curl言語
~マクロを用いた言語カスタマイズ~(基礎編)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2011/09/14 14:00

 Curlのマクロはご存知でしょうか。Curlのマクロは、「複数個所に記述されるインラインロジックをマクロにして可読性を良くするもの」から「構文解析機能を利用して構文ルールをカスタマイズするもの」まで広範囲に適用することが可能です。実際、Curlコンパイラも多くの箇所でマクロを使用し言語の拡張や実行速度の向上に使用しています。基礎編は、まだCurlのマクロを使ったことがない方を対象に、簡単な使い方について紹介します。

目次

はじめに

 Curlのマクロの特徴を要約すると、次の3点があげられます。

  1. ソースコード実行中にマクロを展開
  2. コンパイル時に評価されるデータ構造や値を使った展開
  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」は、以下からダウンロードが可能です。 インストールに関しては、こちらを参照ください。

 まずは、下記のプログラムを見てください。

プログラム例1
{define-proc {xfloor dividend:int, divisor:int}:(int, int)
     def (quotient, remainder ) = {floor dividend, divisor}
    {return (quotient, remainder)}
}

 このプロシージャは、引数divisorにゼロが渡ってくると「整数値において、ゼロ値での除法が行われました。」という例外が発生します。例は簡単なものなので通常トレースは入れませんが、複雑な業務APでは、プロシージャの入口・出口・主要箇所にトレースを入れ、デバッグを行います。機能によっては、サービス開始以降もトレースのレベルを下げて必要なトレースを出し続けることもあるでしょう。そんな場合には、マクロが便利です。

 それでは次ページより、マクロを使って、xfloorプロシージャの入口で引数の情報、出口で演算結果の情報を出力するプログラムに書き換えます。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

バックナンバー

連載:CurlデベロッパーセンターPick Up

もっと読む

All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5