SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CurlデベロッパーセンターPick Up(AD)

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

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

マクロの便利機能を使ってみよう

 前ページで説明したマクロ定義(macro.curl)を、Curlマクロの便利な機能で改善します。具体的には、下記の2点を修正します。

  1. マクロの引数を1つ以上持つ、可変な引数
  2. 引数の識別子の文字列をハードコーディングしない

 マクロ定義(macro.curl)は下記になります。

macro.curl
{curl 8.0 package}
{curl-file-attributes character-encoding = "shift-jis"}
{package MACRO}

{import * from CURL.IDE.CPA.SOURCE}
{import * from CURL.LANGUAGE.SOURCE}

{define-macro public {logging
                         ?head:token,
                         ?args:{bounded-comma-sequence
                                   1, infinity ,
                                   ?:identifier
                                }                     ||(1)
                     }
    
    def common = 
        {expand-template
            "【" & ?tag & "】" & {this-function} & "関数" &
 "[" & {this-line} & "行目]" 
        }

    def arg-info = {{Array-of CurlSource}}

    {for arg key i in args do                       ||(2)
        {if i > 0 then
            {arg-info.append {Operator OperatorKind.Ampersand}}
            {arg-info.append {CurlSource.from-string "\",\""}}
            {arg-info.append {Operator OperatorKind.Ampersand}}
        }
        {arg-info.append {CurlSource.from-string "\"" & {arg.get-text} & ":\""}}   ||(3)
        {arg-info.append {Operator OperatorKind.Ampersand}}
        {arg-info.append arg}                       ||(4)
    }
    
    {return
        {expand-template
            {output ?common & "(" & ?arg-info & ")" }
        }
    }
}

  • (1)可変引数定義
  • (2)可変引数を取り出す
  • (3)識別子を文字列で取り出す
  • (4)識別子

 上記のマクロ定義(macro.curl)を前ページで紹介したプログラムと置き換えて実行すると、同じ結果になります。また、展開されるロジックは、下記になります。

入口のマクロ展開
{output "【" & "start" & "】" & {this-function} & "関数" & "[" & {this-line} & "行目]" 
         & "(" & "dividend:"& dividend &","&"divisor:"& divisor & ")" }
出口のマクロ展開
{output "【" & "end" & "】" & {this-function} & "関数" & "[" & {this-line} & "行目]" 
         & "(" & "quotient:"& quotient &","&"remainder:"& remainder & ")" }

 上記の改善プログラムは文字列を編集するために雑多なコードになりましたが、(1)可変引数定義(2)可変引数を取り出す(3)識別子を文字列で取り出す(4)識別子という4点が改善ポイントになります。

マニフェストと連携してみよう

 マクロ定義時、macro-envが暗黙引数として渡ってきます。そのため、マニフェスト情報を簡単に参照することが可能です。今回は、マニフェスト情報を使用して、マクロを無効にする方法を1つ紹介します。

 マニフェストに任意の識別子logging-levelを追加してマクロ定義側で参照し、マクロを無効にします。修正箇所は、下記の2か所です。

(1)マニフェスト(manifest.mcurl)
{curl 8.0 manifest}
{curl-file-attributes character-encoding = "shift-jis"}
{manifest sample
    , logging-level = 0
}
                                                                      || 識別子の定義
   以下、省略
(2)マクロ定義(macro.curl)
{curl 8.0 package}
{curl-file-attributes character-encoding = "shift-jis"}
{package MACRO}

{import * from CURL.IDE.CPA.SOURCE}
{import * from CURL.LANGUAGE.SOURCE}

{define-macro public {debuginfo ?head:token,
                                ?arg1:identifier,
                                ?arg2:identifier
                     }

    {if {macro-env.manifest.meta-data.get "logging-level"} == 0 then  || 識別子の参照
        {return
            {expand-template }                                        || 空を返却
        }
    }
    
    以下、省略

 業務APにおいて、業務共通のような情報により動作を変える局面が多々あると思います。レベルにより、出力情報を変更することも可能です。

次のページ
使用したマクロの機能

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
CurlデベロッパーセンターPick Up連載記事一覧

もっと読む

この記事の著者

五百藏 隆文(イオロイ タカフミ)

1988年よりCOBOLコンパイラの開発に10年間従事した後、公共系の設計・開発を担当。 2010年よりCurlコンパイラの開発に参画する。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6130 2011/09/14 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング