コンパイラ・インタプリタ・トップレベル

コマンドライン

コマンドライン引数により、cduceは対話的なトップレベル、インタプリタ、コンパイラ、またはローダのいずれかとして振舞う。

--argオプションに続く引数は、スクリプトのコマンドラインである。CDuceの中でargv演算子(型[] -> [ String* ])を使ってアクセスすることができる。

オプションや引数には、次のようなものがある。

スクリプト

CDuceはスクリプトを書いて使うことができる。通常、スクリプトを#!install_dir/cduceCDuceで始め、インタプリタをバッチ形式で呼び出せば十分である。スクリプトを呼び出す際に--argが来るのを避けるために、--scriptオプションを用いることができる。これは、Evolutionメールクライアントのフィルタのタイトルを全て印字するスクリプトファイルのサンプルである。

#!/bin/env cduce --script

type Filter = <filteroptions>[<ruleset> [(<rule>[<title>String _*])+]];;

let src : Latin1 =
  match argv [] with
    | [ f ] -> f
    | _ -> raise "Invalid command line"
in
let filter : Filter = 
      match load_xml src with
       | x&Filter -> x
       | _ -> raise "Not a filter document"
in 
print_xml(<filters>([filter]/<ruleset>_/<rule>_/<title>_)) ;;

フレーズ

CDuceのプログラムは、フレーズの列であり、フレーズは、;;で並べたり、区切ったりすることができる。フレーズには幾つかの種類がある。

トップレベル

CDuceファイルがコマンドラインで与えられなければ、インタプリタは対話的トップレベルとして振舞う。

トップレベルのフレーズは、各;;の後で処理される。型又は関数の相互再帰宣言は、一つの隣り合うフレーズ列(間に;;がない)に含まれなければならない。

トップレベルは、トップレベル命令#quitだけでなく、Ctrl-CやCtrl-Dでも終了できる。別の選択肢はビルトインのexitを使うことである。

トップレベル命令#helpは、利用可能なトップレベル命令に関するヘルプメッセージを印字する。

トップレベル命令#envは、現在の環境を表示する。環境とは、グローバル型及び値、さらには、現在時点での、構文分析(ユーザ定義)、及び清書(CDuce算出)に使われる、接頭辞・名前空間束縛である。

二つのトップレベル命令#silent及び#verboseは、トップレベルの出力(型及び評価の結果)を抑制したり、促進したりするために使われる。

トップレベル命令#reinit_nsは、名前空間付きで値や型を清書する際に用いられる接頭辞・名前空間束縛の表を再初期化する(XML名前空間を参照)。

トップレベル命令#print_typeは、CDuce型の式を表示する(XMLスキーマ文書からインポートされた型を含む)。

トップレベル命令#builtinsは、組み込みOCaml値の名前を印字する(CDuceのOCamlとのインタフェースを参照のこと)。

トップレベルには、行編集機能はない。leditのような外部ラッパを用いるとよい。

字句の実体

識別子(変数、型、再帰パターン、…)は、XML名前空間の意味で、修飾された名前である。XML名前空間の章で、CDuceにおいて名前空間接頭辞を定義する方法を説明している。識別子は、XMLの属性として解決される(デフォルトの名前空間が適用されないということを意味する)。全ての識別子は同じスコープにある。例えば、同じ名前を型と変数(又はスキーマ、名前空間接頭辞、外部ユニットに対するエイリアス)で同時に使うことはできない。

識別子中のドットは、ドット記法の曖昧さを避けるため、バックスラッシュで保護されなければならない。

ドット記法は幾つかの目的のためにある。

CDuceは、二つのコメント様式をサポートしている。(* ... *)及び/* ... */である。最初のスタイルは、プログラマがコードの一部を除外することができるようにするためのものである。ネストにすることができ、シングル、又はダブルクォート中の文字列中では、終端の目印*)を探さない。特に、シングルクォート(及びアポストロフィ)は、(* ... *)コメントの中で釣りあわなければならない。別のスタイル/* ... */はテキストのコメントに適している。ネストにできず、クォートをコメント内で特別に扱ったりはしない。