OMAKE_VERSION
OMakeのバージョンを表します。
STDLIB
OMakeの基本ライブラリのファイルがあるディレクトリを表します。起動時に、この変数のデフォルトの値は以下のようにして決定されます。
現在のデフォルトの値は omake --version を走らせることによって参照できます。
OMAKEPATH
include と open 文における検索パスを指定した、ディレクトリの配列です(詳細は “4.7 ファイルのインクルード” を参照してください)。デフォルトの値は . と $(STDLIB) の2つの成分を持った配列です。
OSTYPE
omakeを走らせているマシンのアーキテクチャの集合です。考えられる値は Unix (LinuxやMac OS Xを含む、すべてのUnixのバージョンを表します), Win32 (MS-Windowsでは、OMakeはMSVC++かMingwを用いてコンパイルします), Cygwin (MS-Windowsでは、OMakeはCygwinを用いてコンパイルします)があります。
SYSNAME
現在のマシンのOSの名前を表します。
NODENAME
現在のマシンのホスト名を表します。
OS_VERSION
OSのバージョンを表します。
MACHINE
マシンのアーキテクチャを表します(例: i386 , sparc , etc...)。
HOST
NODENAME と等価です。
USER
処理を実行しているユーザのログイン名を表します。
HOME
処理を実行しているユーザのホームディレクトリを表します。
PID
OMakeのプロセスIDを表します。
TARGETS
コマンドラインのターゲットを表す文字列です。例えば、もしOMakeが以下のコマンドラインで実行されたとしましょう。
omake CFLAGS=1 foo bar.c
この場合、 TARGETS は foo bar.c が定義されます。
BUILD_SUMMARY
BUILD_SUMMARY 変数は omake がビルド状況を要約したファイルが定義されています(メッセージはビルドの最後で出力されます)。ビルドが開始されたとき、このファイルは空です。あなたはビルド中にこのファイルを編集したり追加することで、ビルドの要約に何らかのメッセージを追加できます。
例えば、もしあなたがいくつかのアクションが発生した場所を把握しておきたいとしますと、ビルドの要約に以下を追加することで実現できます。
foo: boo
echo "The file foo was built" >> $(BUILD_SUMMARY)
...build foo...
VERBOSE
いくつかのコマンドのメッセージが冗長に出力されます。デフォルトの値は false で、 --verbose オプションを用いてOMakeが実行された場合、変数の値は true となります。
omakeのブーリアン型は状況に無反応な(case-insensitive)文字列によって表現されます。『偽』は文字列 false , no , nil , undefined , 0 のいづれかによって表現されます。それ以外はすべて『真』となります。
$(not e) : String
e : String
not 関数は真偽値を反転します。
例えば、 $(not false) は true が返され、 $(not hello world) は false が返されます。
equal 関数は2つの値が等しいかどうか比較します。
例えば、 $(equal a, b) は false が返され、 $(equal hello world, hello world) は true が返されます。
$(and e1, ..., en) : String
e1, ..., en: Sequence
and 関数は引数の論理積を評価します。
例えば、以下のコードでは X は真で、 Y は偽となります。
A = a
B = b
X = $(and $(equal $(A), a) true $(equal $(B), b))
Y = $(and $(equal $(A), a) true $(equal $(A), $(B)))
$(or e1, ..., en) : String
e1, ..., en: String Sequence
or 関数は引数の選言を評価します。
例えば、以下のコードでは X は真で、 Y は偽となります。
A = a
B = b
X = $(or $(equal $(A), a) false $(equal $(A), $(B)))
Y = $(or $(equal $(A), $(B)) $(equal $(A), b))
$(if e1, e2[, e3]) : value
e1 : String
e2, e3 : value
if 関数は真偽値を基にした条件分岐を行います。例えば、 $(if $(equal a, b), c, d) は d と評価されます。
条件分岐は以下のような文を用いても宣言できます。
if e1
body1
elseif e2
body2
...
else
bodyn
もし式 e1 が偽でなかったら、 body1 が評価され、結果は条件分岐の値として返されます。もし e1 が偽であるなら、条件分岐は移り変わり e2 の式が用いられます。もしどの条件式も真でなかった場合、 bodyn が評価され、結果は条件分岐の値として返されます。
if 文は任意の数の elseif 文を加えることができます。また、 else 文はなくても構いません。
ノート
各々の条件分岐文はそれぞれのスコープを持っているので、条件文中で定義された変数は通常外から見ることができません。 export コマンドはスコープ中で定義された変数をエクスポートするために用いられます。たとえば、以下の式はCコンパイラの設定を定義するために良く用いられる方法です。
if $(equal $(OSTYPE), Win32)
CC = cl
CFLAGS += /DWIN32
export
else
CC = gcc
CFLAGS += -g -O2
export
switch , match 関数はパターンのマッチングに用いられます。
$(switch <arg>, <pattern_1>, <value_1>, ..., <pattern_n>, <value_n>) $(match <arg>, <pattern_1>, <value_1>, ..., <pattern_n>, <value_n>)
<pattern>/<value> の数は任意です。ただし、引数の数は必ず奇数でなければなりません。
<arg> は文字列として評価され、 <pattern_1> を用いて比較されます。もしマッチしている場合、結果の式は <value_1> が返されます。そうでない場合、マッチする文が見つかるまで、残りのパターンを用いて評価が行われます。
switch 関数はパターンと引数を比較するために用いられます。例えば、以下の表現式では、 FILE 変数は OSTYPE 変数の値に依存して、 foo , bar , あるいは空の文字列が定義されます。
FILE = $(switch $(OSTYPE), Win32, foo, Unix, bar)
match 関数は正規表現を用います( “10.11.1 正規表現” を参照してください)。もしマッチしているパターンが見つかった場合、変数 $1, $2, ... は \( と \) デリミタの間にある文字列が束縛されます。 \0 変数は全体のマッチ文が定義されており、 $* はマッチした文字列の配列が定義されます。
FILE = $(match foo_xyz/bar.a, foo_\\\(.*\\\)/\\\(.*\\\)\.a, foo_$2/$1.o)
switch と match 関数は代わりに(もっと便利な)以下のような形に書くことができます。
match e
case pattern1
body1
case pattern2
body2
...
default
bodyd
式 e が前回のパターンでマッチせずに pattern_i でマッチした場合、 body_i が評価され、 match の結果として返されます。 switch 関数は文字列の比較を行います。 match 関数は正規表現でのマッチングを行います。
match $(FILE)
case $".*\(\.[^\/.]*\)"
println(The string $(FILE) has suffix $1)
default
println(The string $(FILE) has no suffix)
try
try-body
catch class1(v1)
catch-body
when expr
when-body
...
finally
finally-body
try 文は例外を扱うために用いられます。はじめに、 try-body の式が評価されます。
値 v が例外を出さなかった場合、 finally-body の式が評価され値 v が結果として返されます。
try-body の評価がオブジェクト obj の例外を送出した場合、 catch 文が代わりに評価されます。 catch 文の catch class(v) を実行している最中、もし例外のオブジェクト obj がクラス名 class のインスタンスであったならば、変数 v が例外のオブジェクトとして束縛され、 catch-body の式が評価されます。
catch 文が評価されている間中 when 文に遭遇した場合、評価式 expr が評価されます。もし結果が真であったならば、 when-body の式が続けて評価されます。さもなければ、次の catch 文が評価されます。
catch-body か when-body の評価が完全に終わった場合、別の when 文を評価することなく finally-body の式が評価され、値 v が返されます。
try 文には任意の数の catch 文を含めることができます。また、 finally 文はなくても構いません。
raise 関数は例外を送出します。 exn は任意のオブジェクトです。しかしながら、通常は Exception オブジェクトを送出します。
例外が捕らえられなかった場合、全体のオブジェクトはエラーメッセージとして詳細に出力されます。しかしながら、もしオブジェクトが Exception で message フィールドを含んでいるのなら、エラーメッセージは message のみが出力されます。
exit(code)
code : Int
exit 関数はomakeを異常終了させます。
$(exit <code>)
exit 関数は終了コードである整数を引数に指定します。0でない値は異常終了を表します。
$(defined sequence) : String
sequence : Sequence
defined 関数はシーケンス中のすべての変数が現在定義されているか試します。例えば、以下のコードでは変数 X が既に定義されていないかどうかを定義しています。
if $(not $(defined X))
X = a b c
export
これは修飾された変数にも用いることができます。
$(defined X.a.b)
$(defined public.X)
$(defined-env sequence) : String
sequence : String
defined-env 関数は処理している環境で、指定された変数が定義されているかどうか試します。
例えば、以下のコードでは、環境変数 DEBUG が定義されている場合は -g コンパイルオプションを追加します。
if $(defined-env DEBUG)
CFLAGS += -g
export
$(getenv name) : String
$(getenv name, default) : String
getenv 関数は現在処理している環境での変数の値を取得します。この関数は一つか二つの引数を指定する必要があります。
一つの引数を指定した場合、もし環境中で変数が定義されていなかったならば例外を送出します。二つの引数を指定した場合、もし定義されていなかったならば二番目の引数が返されます。
例えば、以下のコードでは、もし環境変数 PATH が定義されていた場合は、その値を空白で分割したリストとして X を定義します。さもなければ /bin /usr/bin が代わりに使われます。
X = $(split $(PATHSEP), $(getenv PATH, /bin:/usr/bin))
以下のような形でも定義することができます。
getenv(NAME)
default
setenv(name, value)
name : String
value : String
setenv 関数は現在処理している環境での変数を定義します。環境変数は通常の変数のようにスコープされます。
unsetenv(names)
names : String Array
unsetenv 関数は現在処理している環境からいくつかの変数を削除します。環境変数は通常の変数のようにスコープされます。
get-registry(hkey, key, field) : String
get-registry(hkey, key, field, default) : String
hkey : String
key : String
field : String
get-registry 関数はWin32上のシステムレジストリから文字列を取得します。他のアーキテクチャ上では、レジストリの値は返されません。
hive (私はこの呼び方が正しいと思っています)では、使用するレジストリの区分を指定します。これは以下の値である必要があります。(訳注: よく意味がわかりませんがhkeyとfiveをもじったもの?)
もしこれらの意味について知りたい場合はマイクロソフトのドキュメントを参照してください。
key はレジストリから取得したいフィールドを指定します。これは A\B\C のような形である必要があります(通常のスラッシュを用いた場合はバックスラッシュに変換されます)。 field は key のサブフィールドを指定します。
4つの引数を取る場合、 default の値が失敗したときに返されます。あなたはこれを別の形で用いることもできます。
get-registry(hkey, key, field)
default
$(getvar name) : String
getvar 関数は変数の値を取得します。
変数が定義されていない場合は例外が送出されます。
例えば、以下のコードでは X を文字列 abc で定義します。
NAME = foo
foo_1 = abc
X = $(getvar $(NAME)_1)
これは修飾された変数にも使うことができます。
$(getvar X.a.b)
setvar(name, value)
name : String
value : String
setvar 関数は新しい変数を定義します。例えば、以下のコードでは X は文字列 abc で定義されます。
NAME = X
setvar($(NAME), abc)
これは修飾された変数にも使うことができます。
setvar(public.X, abc)
$(array elements) : Array
elements : Sequence
array 関数はシーケンスから配列を生成します。もし <arg> が文字列だった場合、配列の成分はホワイトスペースによって区切られた文字列となります。また、クオートによっても区切られます。
加えて、配列の変数は以下のように宣言することもできます。
A[] =
<val1>
...
<valn>
この場合、配列の成分は <val1> , ... , <valn> であり、ホワイトスペースは文字通りに取り扱われます。
$(split sep, elements) : Array
sep : String
elements : Sequence
split 関数は二つの引数を必要とし、一つめには文字列のデリミタ、二つめには区切りたい文字列を指定します。結果は elements シーケンスをセパレータによって区切った配列が返されます。
例えば、以下のコードでは、変数 X は配列 /bin /usr/bin /usr/local/bin に定義されます。
PATH = /bin:/usr/bin:/usr/local/bin
X = $(split :, $(PATH))
sep は除外することもできます。この場合 split はホワイトスペースで区切ります。クオーテーションは区切りません。
$(concat sep, elements) : String
sep : String
elements : Sequence
concat 関数は二つの引数を必要とし、一つめには文字列のセパレータ、二つめにはシーケンスを指定します。結果は隣接した成分の間にセパレータを配置した、結合された文字列が返されます。
例えば、以下のコードでは、変数 X は文字列 foo_x_bar_x_baz に定義されます。
X = foo bar baz
Y = $(concat _x_, $(X))
$(length sequence) : Int
sequence : Sequence
length 関数は引数の成分の数を返します。
例えば、式 $(length a b "c d") は3と評価されます。
$(nth i, sequence) : value
i : Int
sequence : Sequence
raises RuntimeException
nth 関数は引数のi番目の成分を返します。配列のインデックスは0から始まります。もしインデックスが存在しない成分を指定していた場合、例外が送出されます。
例えば、式 $(nth 1, a "b c" d) は "b c" と評価されます。
$(replace-nth i, sequence, x) : value
i : Int
sequence : Sequence
x : value
raises RuntimeException
replace-nth 関数はi番目の成分を新しい値 x に置き換えます。インデックスは0から始まります。もしインデックスが存在しない成分を指定していた場合、例外が送出されます。
例えば、式 $(replace-nth 1, a "b c" d, x) は a x d と評価されます。
$(nth-hd i, sequence) : value
i : Int
sequence : Sequence
raises RuntimeException
nth-hd 関数は最初から i 個までの成分をもった配列を返します。もしシーケンスが i 個より少ない場合は例外が送出されます。
例えば、式 $(nth-hd 2, a "b c" d) は a "b c" と評価されます。
$(nth-tl i, sequence) : value
i : Int
sequence : Sequence
raises RuntimeException
nth-tl 関数は最初から i 個までの成分を除いた、残りの配列を返します。もしシーケンスが i 個より少ない場合には例外が送出されます。
例えば、式 $(nth-tl 1, a "b c" d) は "b c" d と評価されます。
$(subrange off, len, sequent) : value
off : Int
len : Int
sequence : Sequence
raises RuntimeException
subrange 関数はシーケンスの一部分を返します。インデックスは0から始まります。もし指定された範囲に成分が存在しない場合には例外が送出されます。
例えば、式 $(subrange 1, 2, a "b c" d e) は "b c" d と評価されます。
$(rev sequence) : Sequence
sequence : Sequence
rev 関数は指定された配列の順番を逆にした配列を返します。例えば、式 $(rev a "b c" d) は d "b c" a と評価されます。
$(join sequence1, sequence2) : Sequence
sequence1 : Sequence
sequence2 : Sequence
join 関数は二つのシーケンスの成分を互いに結合させます。例えば、 $(join a b c, .c .cpp .h) は a.c b.cpp c.h と評価されます。もし二つの入力シーケンスが異なる長さであった場合は、長いシーケンスの残りの成分は、出力先の配列の終わりに修正されない状態でコピーされます。
$(string sequence) : String
sequence : Sequence
string 関数はシーケンスを一つの文字列にまとめます。これは concat 関数と似ていますが、この成分はホワイトスペースによって分割されています。結果は一つのユニットとして扱われます。ホワイトスペースは重要です。
$(string-length sequence) : Int
sequence : Sequence
string-length 関数は引数の文字列の長さを返します。もし引数がシーケンスであった場合、まとめられた状態で評価されます。よって、 $(string-length sequence) は $(string-length $(string sequence)) と等価です。
$(string-escaped sequence) : String Array
$(ocaml-escaped sequence) : String Array
$(html-escaped sequence) : String Array
$(html-pre-escaped sequence) : String Array
$(c-escaped sequence) : String Array
$(hex-escaped sequence) : StringArray
sequence : Array
string-escaped 関数は引数の各々の成分を文字列に変換し、もしその成分がOMakeの特殊文字を含んでいた場合は、その文字をエスケープした状態で返します。特殊文字は :()\,$'"# とホワイトスペースを含みます。この関数はスキャナルール中で、 stdout に出力する前にファイル名をエスケープするために使われます。
ocaml-escaped 関数はOCamlの特殊文字をエスケープした状態で返します。
c-escaped 関数はCの文字定数に使われるような形の文字列に変換します。
id-escaped 関数はOMakeで使われるような識別子に変換します。
html-escaped 関数はHTMLで文字通りに読み込まれるような形の文字列に変換します。 html-pre-escaped 関数と似ていますが、この関数では改行は <br> に変換されません。
println($(string $(string-escaped $"a b" $"y:z")))
a\ b y\:z
$(decode-uri sequence) : sequence
sequence : Sequence
これら二つの関数はURIのエンコーディングに用いられ、特殊文字を16進数の文字に置き換えます。
osh> s = $(encode-uri $'a b~c')
"a+b%7ec"
osh> decode-uri($s)
"a b~c"
$(quote sequence) : String
sequence : Sequence
quote 関数はシーケンスを一つの文字列にまとめ、さらに文字列にクオートを付与します。内部のクオーテーションはエスケープされます。
例えば、式 $(quote a "b c" d) は "a \"b c\" d" に、 $(quote abc) は "abc" に評価されます。
$(quote-argv sequence) : String
sequence : Sequence
quote-argv 関数はシーケンスを一つの文字列にまとめ、さらに文字列にクオートを付与します。クオーテーションは変換されるため、コマンドラインのパーサは、正常に文字列をその構成要素へと戻すことができます。
$(html-string sequence) : String
sequence : Sequence
html-string 関数はシーケンスを一つの文字列にまとめ、さらに特殊なHTML文字にエスケープします。 concat 関数と似ていますが、この関数はホワイトスペースで分割を行います。結果は一つの文字列として返されます。
$(addsuffix suffix, sequence) : Array
suffix : String
sequence : Sequence
addsuffix 関数はシーケンスの各々の成分に接尾辞を付与します。返される配列の長さは、指定されたシーケンスの配列の長さと全く同じです。
例えば、 $(addsuffix .c, a b "c d") は a.c b.c "c d".c と評価されます。
$(mapsuffix suffix, sequence) : Array
suffix : value
sequence : Sequence
mapsuffix 関数はシーケンスの各々の成分に接尾辞を付与します。これは addsuffix 関数と似ていますが、この関数は文字列をくっ付ける代わりに新しく成分を追加します。よって、返される配列の長さは、指定されたシーケンスの配列の長さの2倍です。
例えば、 $(mapsuffix .c, a b "c d") は a .c b .c "c d" .c と評価されます。
$(addsuffixes suffixes, sequence) : Array
suffixes : Sequence
sequence : Sequence
addsuffixes 関数は最初の引数に指定されたすべての接尾辞をシーケンスの各々の成分に付与します。もし suffixes が n 個の成分を、 sequence が m 個の成分を持っていた場合、結果は n * m 個の成分を持ったシーケンスが返されます。
例えば、 $(addsuffixes .c .o, a b c) は a.c a.o b.c b.o c.c c.o と評価されます。
$(removeprefix prefix, sequence) : Array
prefix : String
sequence : Array
removeprefix 関数はシーケンスの各々の成分から接頭辞を取り除きます。
$(removesuffix sequence) : Array
sequence : String
removesuffix 関数はシーケンスの各々の成分から接尾辞を取り除きます。
例えば、 $(removesuffix a.c b.foo "c d") の結果は a b "c d" となります。
$(replacesuffixes old-suffixes, new-suffixes, sequence) : Array
old-suffixes : Sequence
new-suffixes : Sequence
sequence : Sequence
replacesuffixes 関数はシーケンスの各々の成分の接尾辞を置き換えます。 old-suffixes と new-suffixes シーケンスは同じ長さである必要があります。
例えば、 $(replacesuffixes .h .c, .o .o, a.c b.h c.z) の結果は a.o b.o c.z となります。
$(addprefix prefix, sequence) : Array
prefix : String
sequence : Sequence
addprefix 関数はシーケンスの各々の成分に接頭辞を付与します。返される配列の長さは、指定されたシーケンスの配列の長さと全く同じです。
例えば、 $(addprefix foo/, a b "c d") は foo/a foo/b foo/"c d" と評価されます。
$(mapprefix prefix, sequence) : Array
prefix : String
sequence : Sequence
mapprefix 関数はシーケンスの各々の成分に接頭辞を付与します。これは addprefix 関数と似ていますが、この関数は文字列をくっ付ける代わりに新しく成分を追加します。よって、返される配列の長さは、指定されたシーケンスの配列の長さの2倍です。
例えば、 $(mapprefix foo, a b "c d") の結果は foo a foo b foo "c d" となります。
$(add-wrapper prefix, suffix, sequence) : Array
prefix : String
suffix : String
sequence : Sequence
add-wrapper 関数はシーケンスの各々の成分に接頭辞と接尾辞の両方を付与します。例えば、 $(add-wrapper dir/, .c, a b) は dir/a.c dir/b.c と評価されます。文字列は結合されるため、返される配列の長さは、指定されたシーケンスの長さと全く同じです。
$(set sequence) : Array
sequence : Sequence
set 関数は文字列の集合をソートします。さらに、重複した成分を除去します。
例えば、 $(set z y z "m n" w a) の結果は "m n" a w y z となります。
$(mem elem, sequence) : Boolean
elem : String
sequence : Sequence
mem 関数はシーケンス中に指定した成分が含まれているかどうか調べます。
例えば、 $(mem "m n", y z "m n" w a) は true と評価され、一方で $(mem m n, y z "m n" w a) は false と評価されます。
$(intersection sequence1, sequence2) : Array
sequence1 : Sequence
sequence2 : Sequence
intersection 関数は指定された二つの集合の和をとります。返される配列の長さは不定であり、重複があればそれを含みます。もし結果をソートし、さらに重複を除きたい場合は set 関数を使ってください。
例えば、 $(intersection c a b a, b a) は a b a と評価されます。
$(intersects sequence1, sequence2) : Boolean
sequence1 : Sequence
sequence2 : Sequence
intersects 関数は二つの集合の和が空集合でないかどうか調べます。これは集合の和を計算し、空であるかどうか調べるよりも少しだけ効率的です。
例えば、 $(intersects a b c, d c e) は true と評価され、 $(intersects a b c a, d e f) は false と評価されます。
$(set-diff sequence1, sequence2) : Array
sequence1 : Sequence
sequence2 : Sequence
set-diff 関数は二つの集合の差異を計算します。結果は sequence1 には含まれるが sequence2 には含まれていない成分からなる配列です。返される配列の長さは不定であり、重複があればそれを含みます。もし結果をソートし、さらに重複を除きたい場合は set 関数を使ってください。 (訳注: この関数は集合論における f(A,B) = A - B と等価です。)
例えば、 $(set-diff c a b a e, b a) は c e と評価されます。
$(set-diff sequence1, sequence2) : Array
sequence1 : Sequence
sequence2 : Sequence
filter 関数はシーケンスから特定の成分を抜き出します。 patterns にはパターンを定義した、空でないシーケンスを指定します。また、パターンにはワイルドカード % を含めることができます。
例えば、 $(filter %.h %.o, a.c x.o b.h y.o "hello world".c) は x.o b.h y.o と評価されます。
$(filter-out patterns, sequence) : Array
patterns : Sequence
sequence : Sequence
filter-out 関数はシーケンスから特定の成分を除去します。 patterns にはパターンを定義した、空でないシーケンスを指定します。また、パターンにはワイルドカード % を含めることができます。
例えば、 $(filter-out %.c %.h, a.c x.o b.h y.o "hello world".c) は x.o y.o と評価されます。
$(capitalize sequence) : Array
sequence : Sequence
capitalize 関数はシーケンスの各々の成分の単語を大文字化します。例えば、 $(capitalize through the looking Glass) は Through The Looking Glass と評価されます。
$(uncapitalize sequence) : Array
sequence : Sequence
uncapitalize 関数は引数に指定された各々の単語を小文字化します。
例えば、 $(uncapitalize through the looking Glass) は through the looking glass と評価されます。
$(uppercase sequence) : Array
sequence : Sequence
uppercase 関数はシーケンス中の文字すべてを大文字化します。例えば、 $(uppercase through the looking Glass) は THROUGH THE LOOKING GLASS と評価されます。
$(lowercase sequence) : Array
sequence : Sequence
lowercase 関数はシーケンス中の文字すべてを小文字化します。
例えば、 $(lowercase through tHe looking Glass) は through the looking glass と評価されます。
system(s)
s : Sequence
system 関数はシェル上のコマンドを評価するために用いられます。シェルコマンドを評価するため、omakeは内部でこの関数を使用しています。
例えば、以下のプログラムは式 system(ls foo) と等価です。
ls foo
$(shell command) : Array
$(shella command) : Array
$(shell-code command) : Int
command : Sequence
shell 関数はシェルコマンドを用いてコマンドを評価し、さらに標準出力先に出力された、ホワイトスペースで区切ってある出力結果を返します。
shella 関数は同様に振る舞いますが、この関数では改行をそのまま出力するのではなく、分割された配列として返します。
shell-code は結果として終了コードを返します。出力は返されません。
例えば、もしカレントディレクトリがファイル OMakeroot , OMakefile , hello.c を含んでいる場合、 $(shell ls) はUnixシステム上では hello.c OMakefile OMakeroot と評価されます。
export 関数は現在の環境中の変数の値を保存します。
例えば、以下のコードは 1 1 2 と出力されます。
A = 1
B = 1
C = 1
SAVE_ENV = $(export A B)
A = 2
B = 2
C = 2
export($(SAVE_ENV))
println($A $B $C)
この関数に引数を指定することは、 export 文を用いて引数を指定するのと全く等価なものとして解釈されます(詳細は “6.3 環境のエクスポート” を参照してください)。
while <test>
<body>
あるいは
while <test>
case <test1>
<body1>
...
case <testn>
<bodyn>
default
<bodyd>
<test> が真である間はずっとループの式が実行されます。最初の形では、 <body> はすべてのループにおいて実行されます。二番目の形では、もし <testI> が真であった場合は <bodyI> が実行されます。もしなにも当てはまらない場合には <bodyd> が実行されます。もしすべての場合において真でなかったならば、ループは終了します。なお、ループ中の環境は自動的にエクスポートされます。
例えば、 i を 0 から 9 まで繰り返します。
i = 0
while $(lt $i, 10)
echo $i
i = $(add $i, 1)
上の例は以下の例と等価です。
i = 0
while true
case $(lt $i, 10)
echo $i
i = $(add $i, 1)
以下の例は似ていますが、いくつかの特殊な場合においてある文字が出力されます。その他は値が出力されます。
i = 0
while $(lt $i, 10)
case $(equal $i, 0)
echo zero
case $(equal $i, 1)
echo one
default
echo $i
break 関数は while ループを早期に抜けたい場合に用いられます。
random-init(i)
i : Int
random() : Int
乱数を生成します。値は疑似乱数で、暗号として用いられるほどセキュアではありません。
乱数生成器はシステムの乱数器を用いて初期化します。よって、次にプログラムを走らせたときの乱数の値は前回と異なります。 ramdom-init 関数は特定の値を用いて乱数生成器を初期化します。
以下の関数は基本的な数学の演算を行います。
以下の関数は数学的な評価を行います。
(訳注: ここでいう(符号なし)とは符号ビットを考慮しないで評価を行うことを表しています。例えば、int型とunsigned int型では同じビット数に対してそれぞれ表している数値が異なります。(符号なし)の演算子はこのような場合に用いられます。)
fun 関数は匿名関数を生成します。
$(fun <v1>, ..., <vn>, <body>)
最後の引数には関数の内容を記述します。他の引数はパラメータ名を指定します。
例えば、以下の3つの関数定義は等価です。
F(X, Y) =
return($(addsuffix $(Y), $(X)))
F = $(fun X, Y, $(addsuffix $(Y), $(X)))
F =
fun(X, Y)
value $(addsuffix $(Y), $(X))
apply 関数は関数に値を適用します。
$(apply <fun>, <args>)
以下の関数定義を行った場合について考えてみましょう。
F(X, Y) =
return($(addsuffix $(Y), $(X)))
以下の2つの式は等価です。
X = F(a b c, .c)
X = $(apply $(F), a b c, .c)
applya 関数は引数の配列を関数に適用します。
$(applya <fun>, <args>)
例えば、以下のプログラムでは Z の値は file.c となります。
F(X, Y) =
return($(addsuffix $(Y), $(X)))
args[] =
file
.c
Z = $(applya $(F), $(args))
create-map 関数は簡単に Map オブジェクトを作る関数です。 create-map 関数はキー/値のペアを引数によって指定するので、引数の数は等しくなければなりません。例えば、以下の2つの式は等価です。
X = $(create-map name1, xxx, name2, yyy)
X. =
extends $(Map)
$|name1| = xxx
$|name2| = yyy
create-lazy-map 関数は create-map と似ていますが、この関数は値が遅延評価されます。例えば、以下の2つの式は等価です。
Y = $(create-lazy-map name1, $(xxx), name2, $(yyy))
Y. =
extends $(Map)
$|name1| = $`(xxx)
$|name2| = $`(yyy)
create-lazy-map 関数はルールを生成する際に用いられます。
foreach 関数はシーケンスすべての成分にわたって関数を適用します。
$(foreach <fun>, <args>)
foreach(<var>, <args>)
<body>
例えば、以下のプログラムでは変数 X は配列 a.c b.c c.c と定義されます。
X =
foreach(x, a b c)
value $(x).c
# 等価な式
X = $(foreach $(fun x, $(x).c), abc)
これらの表現を省略することもできます。
export 文は foreach の内容に使うこともできます。例えば、以下の式の X は最終的に a.c b.c c.c となります。
X =
foreach(x, a b c)
X += $(x).c
export
break 関数はこのようなループを早期に抜けたい場合に用いられます。
forall 関数は <body> がシーケンスのすべての成分に当てはまっているかどうか調べます。
$(sequence-forall <fun>, <args>)
sequence-forall(<var> => ..., <args>)
<body>
exists 関数は <body> がシーケンスのいくつかの成分に当てはまっているかどうか調べます。
$(sequence-exists <fun>, <args>)
sequence-exists(<var> => ..., <args>)
<body>
sort 関数は配列の成分を与えられた評価関数を元にソートします。評価関数は二つの引数(x, y)を取ります。もしx < yであった場合、評価関数は負の値を返す必要があります。同様に、x > yの場合は正の値、x = yの場合は0を返します。
$(sequence-sort <fun>, <args>)
sort(<var>, <var> => ..., <args>)
<body>
compare 関数は二つの値(x, y)を比較します。もしx < yであった場合、この関数は負の値を返します。同様に、x > yの場合は正の値、x = yの場合は0を返します。
$(compare x, y) : Int