マクロを使ってCurl言語を拡張
言語拡張
作者 岡田 一志   
2008年5月01日(木曜日) 00:00

Curlでは、マクロという機能があります。マクロは、Curl言語を拡張するための機能で、Curlのon、after、for、define-class、define-proc、define-text-proc等のようなものも、実際マクロとして作成されています。そのため、define-procやdefine-classで作成されるようなオブジェクトを生成するものでもありません。

 では、サンプルを例に説明していきます。以下のサンプルは、処理の最初・終了または成功時・エラー時に指定した変数をトレースするというものです。

|| macro-package.scurl
{curl 6.0 package}
{package MACRO-TEST}
{define-macro public {with-trace
                         trace ?buf:expression
                      do
                         ?body:statements
                     }

    {return
        {expand-template
            def trace-proc =
                {proc {tag:String, ?buf}:void
                    {output "TRACE[" & tag & "]" & ?buf}
                }
            {trace-proc "start", ?buf}
            {try
                ?body
                {trace-proc "succeeded", ?buf}
             catch e:Exception do
                {trace-proc "failed", ?buf}
                {throw e}
             finally
                {trace-proc "end", ?buf}
            }
        }
    }
}

マクロはdefine-macroで定義します。マクロは基本的に同一パッケージ内に定義することができませんので、上記のように外部パッケージとして定義します。

マクロ定義の中身の説明ですが、まずはバインド変数として?ではじまる変数名をセットします。この変数に続くexpressionやstatementsは、識別子であるとかステートメントであるということを指定するためのものです。define-macroの処理部分にはexpand-templateなどを利用し、バインド変数等を組み合わせて、ソースコードを生成するコードを記載します。

マクロの実行には以下のようにします。

|| macro-test.curl
{curl 6.0 applet}

{import * from MACRO-TEST,
    location = "macro-package.scurl"
} || パッケージをインポート

{value
    let buf:int = 10

    {with-trace trace buf
     do
        set buf = 1000
    }
}

実行結果

TRACE[start]10
TRACE[succeeded]1000
TRACE[end]1000

参考ドキュメント

マクロの作成

 

 

最終更新 ( 2008年5月01日(木曜日) 11:33 )
 
Copyright 2008 - Sumisho Computer Systems Corporation. All rights reserved.    免責事項   プライバシーポリシー