9. 基本ライブラリ

9.1 ビルドイン変数

  • OMAKE_VERSION

    OMakeのバージョンを表します。

  • STDLIB

    OMakeの基本ライブラリのファイルがあるディレクトリを表します。起動時に、この変数のデフォルトの値は以下のようにして決定されます。

    • OMAKELIB 環境変数の値が存在している場合はその値が用いられます。ただし、値は絶対パスでなければなりません。
    • Windows上では、レジストリのキー HKEY_CURRENT_USER\SOFTWARE\MetaPRL\OMake\OMAKELIBHKEY_LOCAL_MACHINE\SOFTWARE\MetaPRL\OMake\OMAKELIB が調べられ、存在している場合にはその値が用いられます。
    • さもなければコンパイルされた時の値が用いられます。

    現在のデフォルトの値は omake --version を実行することによって参照できます。

  • OMAKEPATH

    includeopen 文における検索パスを指定した、ディレクトリの配列です(詳細は “4.8 ファイルのインクルード” を参照してください)。デフォルトの値は .$(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
    

    この場合、 TARGETSfoo bar.c が定義されます。

  • BUILD_SUMMARY

    BUILD_SUMMARY 変数は omake がビルド状況を要約したファイルが定義されています(メッセージはビルドの最後で出力されます)。ビルドが開始されたとき、このファイルは空です。あなたはビルド中にこのファイルを編集したり追加することで、ビルドの要約に何らかのメッセージを追加できます。

    例えば、もしあなたがいくつかのアクションが発生した場所を把握しておきたいとしますと、ビルドの要約に以下を追加することで実現できます。

    foo: boo
        echo "The file foo was built" >> $(BUILD_SUMMARY)
        ...build foo...
    
  • VERBOSE

    いくつかのコマンドのメッセージが冗長に出力されます。デフォルトの値は false で、 --verbose オプションを用いてOMakeが実行された場合、変数の値は true となります。

9.2 論理式、真偽関数、コマンドのコントロール

omakeのブーリアン型は状況に無反応な(case-insensitive)文字列によって表現されます。『偽』は文字列 false , no , nil , undefined , 0 のいづれかによって表現されます。それ以外はすべて『真』となります。

9.2.1 not

$(not e) : String
   e : String

not 関数は真偽値を反転します。

例えば、 $(not false)true が返されて、 $(not hello world)false が返されます。

9.2.2 equal

equal 関数は2つの値が等しいかどうか比較します。

例えば、 $(equal a, b)false が返されて、 $(equal hello world, hello world)true が返されます。

9.2.3 and

$(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)))

9.2.4 or

$(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))

9.2.5 if

$(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

9.2.6 switch, match

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)

switchmatch 関数は代わりに(もっと便利な)以下のような形に書くことができます。

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)

9.2.7 try

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-bodywhen-body の評価が完全に終わった場合、別の when 文を評価することなく finally-body の式が評価されて、値 v が返されます。

try 文には任意の数の catch 文を含めることができます。また、 finally 文はなくても構いません。

9.2.8 raise

raise 関数は例外を送出します。 exn は任意のオブジェクトです。しかしながら、通常は Exception オブジェクトを送出します。

例外が捕らえられなかった場合、全体のオブジェクトはエラーメッセージとして詳細に出力されます。しかしながら、もしオブジェクトが Exceptionmessage フィールドを含んでいるのなら、エラーメッセージは message のみが出力されます。

9.2.9 exit

exit(code)
   code : Int

exit 関数はomakeを異常終了させます。

$(exit <code>)

exit 関数は終了コードである整数を引数に指定します。0でない値は異常終了を表します。

9.2.10 defined

$(defined sequence) : String
   sequence : Sequence

defined 関数はシーケンス中のすべての変数が現在定義されているか試します。例えば、以下のコードでは変数 X が既に定義されていないかどうかを定義しています。

if $(not $(defined X))
   X = a b c
   export

これは修飾された変数にも用いることができます。

$(defined X.a.b)
$(defined public.X)

9.2.11 defined-env

$(defined-env sequence) : String
   sequence : String

defined-env 関数は処理している環境で、指定された変数が定義されているかどうか試します。

例えば、以下のコードでは、環境変数 DEBUG が定義されている場合は -g コンパイルオプションを追加します。

if $(defined-env DEBUG)
    CFLAGS += -g
    export

9.2.12 getenv

$(getenv name) : String
$(getenv name, default) : String

getenv 関数は現在処理している環境での変数の値を取得します。この関数は一つか二つの引数を指定する必要があります。

一つの引数を指定した場合、もし環境中で変数が定義されていなかったならば例外を送出します。二つの引数を指定した場合、もし定義されていなかったならば二番目の引数が返されます。

例えば、以下のコードでは、もし環境変数 PATH が定義されていた場合は、その値を空白で分割したリストとして X を定義します。さもなければ /bin /usr/bin が代わりに使われます。

X = $(split $(PATHSEP), $(getenv PATH, /bin:/usr/bin))

以下のような形でも定義することができます。

getenv(NAME)
    default

9.2.13 setenv

setenv(name, value)
   name : String
   value : String

setenv 関数は現在処理している環境での変数を定義します。環境変数は通常の変数のようにスコープされます。

9.2.14 unsetenv

unsetenv(names)
   names : String Array

unsetenv 関数は現在処理している環境からいくつかの変数を削除します。環境変数は通常の変数のようにスコープされます。

9.2.15 get-registry

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をもじったもの?)

  • HKEY_CLASSES_ROOT
  • HKEY_CURRENT_CONFIG
  • HKEY_CURRENT_USER
  • HKEY_LOCAL_MACHINE
  • HKEY_USERS

もしこれらの意味について知りたい場合はマイクロソフトのドキュメントを参照してください。

key はレジストリから取得したいフィールドを指定します。これは A\B\C のような形である必要があります(通常のスラッシュを用いた場合はバックスラッシュに変換されます)。 fieldkey のサブフィールドを指定します。

4つの引数を取る場合、 default の値が失敗したときに返されます。あなたはこれを別の形で用いることもできます。

get-registry(hkey, key, field)
   default

9.2.16 getvar

$(getvar name) : String

getvar 関数は変数の値を取得します。

変数が定義されていない場合は例外が送出されます。

例えば、以下のコードでは X を文字列 abc で定義します。

NAME = foo
foo_1 = abc
X = $(getvar $(NAME)_1)

これは修飾された変数にも使うことができます。

$(getvar X.a.b)

9.2.17 setvar

setvar(name, value)
   name : String
   value : String

setvar 関数は新しい変数を定義します。例えば、以下のコードでは X は文字列 abc で定義されます。

NAME = X
setvar($(NAME), abc)

これは修飾された変数にも使うことができます。

setvar(public.X, abc)

9.3 配列とシーケンス

9.3.1 array

$(array elements) : Array
   elements : Sequence

array 関数はシーケンスから配列を生成します。もし <arg> が文字列だった場合、配列の成分はホワイトスペースによって区切られた文字列となります。また、クオートによっても区切られます。

加えて、配列の変数は以下のように宣言することもできます。

A[] =
   <val1>
   ...
   <valn>

この場合、配列の成分は <val1> , ... , <valn> であり、ホワイトスペースは文字通りに取り扱われます。

9.3.2 split

$(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 はホワイトスペースで区切ります。クオーテーションは区切りません。

9.3.3 concat

$(concat sep, elements) : String
   sep : String
   elements : Sequence

concat 関数は二つの引数を必要とし、一つめには文字列のセパレータ、二つめにはシーケンスを指定します。結果は隣接した成分の間にセパレータを配置した、結合された文字列が返されます。

例えば、以下のコードでは、変数 X は文字列 foo_x_bar_x_baz に定義されます。

X = foo  bar     baz
Y = $(concat _x_, $(X))

9.3.4 length

$(length sequence) : Int
   sequence : Sequence

length 関数は引数の成分の数を返します。

例えば、式 $(length a b "c d") は3と評価されます。

9.3.5 nth

$(nth i, sequence) : value
   i : Int
   sequence : Sequence
raises RuntimeException

nth 関数は引数のi番目の成分を返します。配列のインデックスは0から始まります。もしインデックスが存在しない成分を指定していた場合、例外が送出されます。

例えば、式 $(nth 1, a "b c" d)"b c" と評価されます。

9.3.6 replace-nth

$(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 と評価されます。

9.3.7 nth-hd

$(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" と評価されます。

9.3.8 nth-tl

$(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 と評価されます。

9.3.9 subrange

$(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 と評価されます。

9.3.10 rev

$(rev sequence) : Sequence
   sequence : Sequence

rev 関数は指定された配列の順番を逆にした配列を返します。例えば、式 $(rev a "b c" d)d "b c" a と評価されます。

9.3.11 join

$(join sequence1, sequence2) : Sequence
   sequence1 : Sequence
   sequence2 : Sequence

join 関数は二つのシーケンスの成分を互いに結合させます。例えば、 $(join a b c, .c .cpp .h)a.c b.cpp c.h と評価されます。もし二つの入力シーケンスが異なる長さであった場合は、長いシーケンスの残りの成分は、出力先の配列の終わりに修正されない状態でコピーされます。

9.3.12 string

$(string sequence) : String
   sequence : Sequence

string 関数はシーケンスを一つの文字列にまとめます。これは concat 関数と似ていますが、この成分はホワイトスペースによって分割されています。結果は一つのユニットとして扱われます。ホワイトスペースは重要です。

9.3.13 string-length

$(string-length sequence) : Int
   sequence : Sequence

string-length 関数は引数の文字列の長さを返します。もし引数がシーケンスであった場合、まとめられた状態で評価されます。よって、 $(string-length sequence)$(string-length $(string sequence)) と等価です。

9.3.14 string-escaped, ocaml-escaped, html-escaped, html-pre-escaped, c-escaped, id-escaped

$(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

9.3.15 decode-uri, encode-uri

$(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"

9.3.16 quote

$(quote sequence) : String
   sequence : Sequence

quote 関数はシーケンスを一つの文字列にまとめ、さらに文字列にクオートを付与します。内部のクオーテーションはエスケープされます。

例えば、式 $(quote a "b c" d)"a \"b c\" d" に、 $(quote abc)"abc" に評価されます。

9.3.17 quote-argv

$(quote-argv sequence) : String
   sequence : Sequence

quote-argv 関数はシーケンスを一つの文字列にまとめ、さらに文字列にクオートを付与します。クオーテーションは変換されるため、コマンドラインのパーサは、正常に文字列をその構成要素へと戻すことができます。

9.3.18 html-string

$(html-string sequence) : String
   sequence : Sequence

html-string 関数はシーケンスを一つの文字列にまとめ、さらに特殊なHTML文字にエスケープします。 concat 関数と似ていますが、この関数はホワイトスペースで分割を行います。結果は一つの文字列として返されます。

9.3.19 addsuffix

$(addsuffix suffix, sequence) : Array
   suffix : String
   sequence : Sequence

addsuffix 関数はシーケンスの各々の成分に接尾辞を付与します。返される配列の長さは、指定されたシーケンスの配列の長さと全く同じです。

例えば、 $(addsuffix .c, a b "c d")a.c b.c "c d".c と評価されます。

9.3.20 mapsuffix

$(mapsuffix suffix, sequence) : Array
   suffix : value
   sequence : Sequence

mapsuffix 関数はシーケンスの各々の成分に接尾辞を付与します。これは addsuffix 関数と似ていますが、この関数は文字列をくっ付ける代わりに新しく成分を追加します。よって、返される配列の長さは、指定されたシーケンスの配列の長さの2倍です。

例えば、 $(mapsuffix .c, a b "c d")a .c b .c "c d" .c と評価されます。

9.3.21 addsuffixes

$(addsuffixes suffixes, sequence) : Array
   suffixes : Sequence
   sequence : Sequence

addsuffixes 関数は最初の引数に指定されたすべての接尾辞をシーケンスの各々の成分に付与します。もし suffixesn 個の成分を、 sequencem 個の成分を持っていた場合、結果は n * m 個の成分を持ったシーケンスが返されます。

例えば、 $(addsuffixes .c .o, a b c)a.c a.o b.c b.o c.c c.o と評価されます。

9.3.22 removeprefix

$(removeprefix prefix, sequence) : Array
   prefix : String
   sequence : Array

removeprefix 関数はシーケンスの各々の成分から接頭辞を取り除きます。

9.3.23 removesuffix

$(removesuffix sequence) : Array
   sequence : String

removesuffix 関数はシーケンスの各々の成分から接尾辞(拡張子)を取り除きます。

例えば、 $(removesuffix a.c b.foo "c d") の結果は a b "c d" となります。

9.3.24 replacesuffixes

$(replacesuffixes old-suffixes, new-suffixes, sequence) : Array
   old-suffixes : Sequence
   new-suffixes : Sequence
   sequence : Sequence

replacesuffixes 関数はシーケンスの各々の成分の接尾辞(拡張子)を置き換えます。 old-suffixesnew-suffixes シーケンスは同じ長さである必要があります。

例えば、 $(replacesuffixes .h .c, .o .o, a.c b.h c.z) の結果は a.o b.o c.z となります。

9.3.25 addprefix

$(addprefix prefix, sequence) : Array
   prefix : String
   sequence : Sequence

addprefix 関数はシーケンスの各々の成分に接頭辞を付与します。返される配列の長さは、指定されたシーケンスの配列の長さと全く同じです。

例えば、 $(addprefix foo/, a b "c d")foo/a foo/b foo/"c d" と評価されます。

9.3.26 mapprefix

$(mapprefix prefix, sequence) : Array
   prefix : String
   sequence : Sequence

mapprefix 関数はシーケンスの各々の成分に接頭辞を付与します。これは addprefix 関数と似ていますが、この関数は文字列をくっ付ける代わりに新しく成分を追加します。よって、返される配列の長さは、指定されたシーケンスの配列の長さの2倍です。

例えば、 $(mapprefix foo, a b "c d") の結果は foo a foo b foo "c d" となります。

9.3.27 add-wrapper

$(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 と評価されます。文字列は結合されるため、返される配列の長さは、指定されたシーケンスの長さと全く同じです。

9.3.28 set

$(set sequence) : Array
   sequence : Sequence

set 関数は文字列の集合をソートします。さらに、重複した成分を除去します。

例えば、 $(set z y z "m n" w a) の結果は "m n" a w y z となります。

9.3.29 mem

$(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 と評価されます。

9.3.30 intersection

$(intersection sequence1, sequence2) : Array
   sequence1 : Sequence
   sequence2 : Sequence

intersection 関数は指定された二つの集合の和をとります。返される配列の長さは不定であり、重複があればそれを含みます。もし結果をソートし、さらに重複を除きたい場合は set 関数を使ってください。

例えば、 $(intersection c a b a, b a)a b a と評価されます。

9.3.31 intersects

$(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 と評価されます。

9.3.32 set-diff

$(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 と評価されます。

9.3.33 filter

$(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 と評価されます。

9.3.34 filter-out

$(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 と評価されます。

9.3.35 capitalize

$(capitalize sequence) : Array
   sequence : Sequence

capitalize 関数はシーケンスの各々の成分の単語を大文字化します。例えば、 $(capitalize through the looking Glass)Through The Looking Glass と評価されます。

9.3.36 uncapitalize

$(uncapitalize sequence) : Array
   sequence : Sequence

uncapitalize 関数は引数に指定された各々の単語を小文字化します。

例えば、 $(uncapitalize through the looking Glass)through the looking glass と評価されます。

9.3.37 uppercase

$(uppercase sequence) : Array
   sequence : Sequence

uppercase 関数はシーケンス中の文字すべてを大文字化します。例えば、 $(uppercase through the looking Glass)THROUGH THE LOOKING GLASS と評価されます。

9.3.38 lowercase

$(lowercase sequence) : Array
   sequence : Sequence

lowercase 関数はシーケンス中の文字すべてを小文字化します。

例えば、 $(lowercase through tHe looking Glass)through the looking glass と評価されます。

9.3.39 system

system(s)
   s : Sequence

system 関数はシェル上のコマンドを評価するために用いられます。シェルコマンドを評価するため、omakeは内部でこの関数を使用しています。

例えば、以下のプログラムは式 system(ls foo) と等価です。

ls foo

9.3.40 shell

$(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 と評価されます。

9.3.41 export

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 環境のエクスポート” を参照してください)。

9.3.42 while

while <test>
   <body>

あるいは

while <test>
case <test1>
   <body1>
...
case <testn>
   <bodyn>
default
   <bodyd>

<test> が真である間はずっとループの式が実行されます。最初の形では、 <body> はすべてのループにおいて実行されます。二番目の形では、もし <testI> が真であった場合は <bodyI> が実行されます。もしなにも当てはまらない場合には <bodyd> が実行されます。もしすべての場合において真でなかったならば、ループは終了します。なお、ループ中の環境は自動的にエクスポートされます。

例えば、 i0 から 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 ループを早期に抜けたい場合に用いられます。

9.3.43 break

break

最も近いループから抜け出し、現在の状態を返します。

9.3.44 random, random-init

random-init(i)
    i : Int
random() : Int

乱数を生成します。値は疑似乱数で、暗号として用いられるほどセキュアではありません。

乱数生成器はシステムの乱数器を用いて初期化します。よって、次にプログラムを実行したときの乱数の値は前回と異なります。 ramdom-init 関数は特定の値を用いて乱数生成器を初期化します。

9.4 演算

9.4.1 int

int 関数は整数値を作るために用いられ、 Int オブジェクトを返します。

$(int 17)

9.4.2 float

float 関数は浮動小数点値を作るために用いられ、 Float オブジェクトを返します。

$(float 3.1415926)

9.4.3 基本的な演算

以下の関数は基本的な数学の演算を行います。

  • $(neg <numbers>) : 数学的な反転
  • $(add <numbers>) : 加算
  • $(sub <numbers>) : 減算
  • $(mul <numbers>) : 乗算
  • $(div <numbers>) : 除算
  • $(mod <numbers>) : 余り
  • $(lnot <numbers>) : ビット単位NOT
  • $(land <numbers>) : ビット単位AND
  • $(lor <numbers>) : ビット単位OR
  • $(lxor <numbers>) : ビット単位XOR
  • $(lsl <numbers>) : 論理左シフト
  • $(lsr <numbers>) : 論理右シフト
  • $(asr <numbers>) : 算術右シフト
  • $(min <numbers>) : 最も小さい成分
  • $(max <numbers>) : 最も大きい成分

9.4.4 評価

以下の関数は数学的な評価を行います。

  • $(lt <numbers>) : ~より少ない (A < B)
  • $(le <numbers>) : ~以下 (A <= B)
  • $(eq <numbers>) : 等しい (A == B)
  • $(ge <numbers>) : ~以上 (A >= B)
  • $(gt <numbers>) : ~より多い (A > B)
  • $(ult <numbers>) : ~より少ない(符号なし)
  • $(ule <numbers>) : ~以下(符号なし)
  • $(uge <numbers>) : ~以上(符号なし)
  • $(ugt <numbers>) : ~より多い(符号なし)

ノート

訳注: ここでいう(符号なし)とは符号ビットを考慮しないで評価を行うことを表しています。例えば、int型とunsigned int型では同じビット数に対してそれぞれ表している数値が異なります。(符号なし)の演算子はこのような場合に用いられます。

9.5 基本的な関数群

9.5.1 fun

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))

9.5.2 apply

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)

9.5.3 applya

applya 関数は引数の配列を関数に適用します。

$(applya <fun>, <args>)

例えば、以下のプログラムでは Z の値は file.c となります。

F(X, Y) =
   return($(addsuffix $(Y), $(X)))
args[] =
   file
   .c
Z = $(applya $(F), $(args))

9.5.4 create-map, create-lazy-map

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 関数はルールを生成する際に用いられます。

9.6 イテレーションとマッピング

9.6.1 foreach

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 関数はこのようなループを早期に抜けたい場合に用いられます。

9.7 ブーリアン関数群

9.7.1 sequence-forall

forall 関数は <body> がシーケンスのすべての成分に当てはまっているかどうか調べます。

$(sequence-forall <fun>, <args>)

sequence-forall(<var> => ..., <args>)
   <body>

9.7.2 sequence-exists

exists 関数は <body> がシーケンスのいくつかの成分に当てはまっているかどうか調べます。

$(sequence-exists <fun>, <args>)

sequence-exists(<var> => ..., <args>)
   <body>

9.7.3 sequence-sort

sort 関数は配列の成分を与えられた評価関数を元にソートします。評価関数は二つの引数(x, y)を取ります。もしx < yであった場合、評価関数は負の値を返す必要があります。同様に、x > yの場合は正の値、x = yの場合は0を返します。

$(sequence-sort <fun>, <args>)

sort(<var>, <var> => ..., <args>)
   <body>

9.7.4 compare

compare 関数は二つの値(x, y)を比較します。もしx < yであった場合、この関数は負の値を返します。同様に、x > yの場合は正の値、x = yの場合は0を返します。

$(compare x, y) : Int

目次

前のトピックへ

8. ビルドルール

次のトピックへ

10. システム関数

このページ

SourceForge.JP

SourceForge.JP

このドキュメントはsourceforge.jpのサーバを利用して提供しています。