• Embed Doc
  • Readcast
  • Collections
  • 1
    CommentGo Back
Download
 
2
2
7
9
 
2
Camlp4
を理解する
はじめに
この文書は
OCaml
の標準ディストリビューションに含まれる
Camlp4
についてのチュートリアルです。普通のチュートリアルとは異なり、実際に
Camlp4
を使って何か有意義なことをするのはずっと後になって出てきます。このような構成をとったことには理由があります。
Camlp4
は非常に理解するのが難しいツールです。その原因の一つ
Camlp4
には通常の
OCaml
の文法や使い方を習得した人にとってさえ新奇な概念がいくつも絡み合って出てきていることです。そのようなツールは「とりあえず使ってみる」やり方では理解に至るのが困難です。そこで、このチュートリアルでは可能な限り一つずつ新たな物事を導入し、一歩一歩ボトムアップ
Camlp4
を理解することができるように心がけました。
プリプロセッサとは何か
Camlp4
の基本的な用途はプリプロセッサです。プリプロセッサとはコンパイラがソースコードを解釈する前段階でソースに変換を加えるプログラムです。例えば
C
言語ではプログラムソースファイルはコンパイラが解釈するまえにまず
cpp
と呼ばれるプリプロセッサによって変換されます。
ソースファイル
 
 
プリプロセッサ
 
ンパ
 
cpp
 
の一般的な用途はマクロ定義と呼ばれる文字列の置き換え、ヘッダファイルの読み込み、そして条件コンパイルです
1
/* C
のマクロの例
:
ソース中の
PI
の出現を
3.14
で置き換える
*/#define PI 3.14/*
ヘッダファイルの読み込みの例
:
この位置に
stdio.h
の内容を読み込ませる
*/#include <stdio.h>/* C
の条件コンパイルの例
:
デバッグ版のコンパイル時のみ
printf()
をコンパイルする
*/int fact(int n){#ifdef DEBUG
1
C
以外の言語ではこうしたことをコンパイラの機能で行うものもあります
 
3
printf("fact(%d)\n", n);#endifif (n == 0) {return 1;} else {return n * fact(n - 1);}
cpp
 
#
 
で始まる行(ディレクティブ)を解釈し、その指示に従ってソースコードを変換していきます。コンパイラは変換結果だけを受け取るため、ディレクティブを読むことはありません。
OCaml
でいろいろなプリプロセッサを使う
ocamlc
 
は通常ソースファイルを直接解釈しますが
-pp
 
オプションを使うことにより任意のコマンドをプリプロセッサとして使うことができます。
ocamlc –pp
プリプロセッサのコマンド 
 
ソースファイル 
使用できるプリプロセッサは
Camlp4
に限られません。以下の例は
sed
 
を使ってソース中の文字列置換をしています。ソースファイルは識別子
PI
を定義していませんが、
seds/PI/3.14/
 
により文字列
PI
3.14
に置き換えることで、コンパイルが通るようになっています。
$ cat tryme.mllet _ = print_float PI$ ocamlc tryme.mlFile "tryme.ml", line 1, characters 20-22:Unbound constructor PI$ ocamlc -pp 'sed s/PI/3.14/' tryme.ml$ ./a.out3.14$
以下のように
cpp
 
を使うこともできます。
$ cat tryme.ml#define PI 3.14let _ = print_float PI$ ocamlc tryme.mlFile "tryme.ml", line 1, characters 0-1:Syntax error$ ocamlc -pp cpp tryme.ml$ ./a.out3.14$
OCaml
専用に作られた
Camlp4
以外のプリプロセッサもあります。
"The Whitespace
of 00

Leave a Comment

You must be to leave a comment.
Submit
Characters: ...
12 / 19 / 2010<span class="translation_missing">en_US, this_document_made_it_onto_the</span>Rising List!
You must be to leave a comment.
Submit
Characters: ...