6 ==================================
11 ----------------------------------
17 ^^^^^^^^^^^^^^^^^^^^^^^^^
21 ^^^^^^^^^^^^^^^^^^^^^^^^^
22 OMakeの基本ライブラリのファイルがあるディレクトリを表します。起動時に、この変数のデフォルトの値は以下のようにして決定されます。
24 * OMAKELIB環境変数の値が存在している場合は用いられます。ただし、値は絶対パスでなければなりません。
25 * Windows上では、レジストリのキー ``HKEY_CURRENT_USER\SOFTWARE\MetaPRL\OMake\OMAKELIB`` と ``HKEY_LOCAL_MACHINE\SOFTWARE\MetaPRL\OMake\OMAKELIB`` が調べられ、もし存在している場合にはその値が用いられます。
26 * さもなければコンパイルされた時の値が用いられます。
28 現在のデフォルトの値は ``omake --version`` を走らせることによって参照できます。
34 ^^^^^^^^^^^^^^^^^^^^^^^^^
35 ``include`` と ``open`` 文における検索パスを指定した、ディレクトリの配列です(詳細は ":ref:`label4.7`" を参照してください)。
36 デフォルトの値は ``.`` と ``$(STDLIB)`` が格納されています。
39 ^^^^^^^^^^^^^^^^^^^^^^^^^
40 omakeを走らせているマシンのアーキテクチャの集合です。考えられる値は ``Unix`` (LinuxやMac OS Xを含む、すべてのUnixのバージョンを表します), ``Win32`` (MS-Windowsでは、OMakeはMSVC++かMingwを用いてコンパイルします), ``Cygwin`` (MS-Windowsでは、OMakeはCygwinを用いてコンパイルします)があります。
46 ^^^^^^^^^^^^^^^^^^^^^^^^^
53 ^^^^^^^^^^^^^^^^^^^^^^^^^
60 ^^^^^^^^^^^^^^^^^^^^^^^^^
67 ^^^^^^^^^^^^^^^^^^^^^^^^^
68 マシンのアーキテクチャを表します(例: ``i386`` , ``sparc`` , etc...)。
74 ^^^^^^^^^^^^^^^^^^^^^^^^^
81 ^^^^^^^^^^^^^^^^^^^^^^^^^
82 処理を実行しているユーザのログイン名を表します。
88 ^^^^^^^^^^^^^^^^^^^^^^^^^
89 処理を実行しているユーザのホームディレクトリを表します。
95 ^^^^^^^^^^^^^^^^^^^^^^^^^
102 ^^^^^^^^^^^^^^^^^^^^^^^^^
103 コマンドラインのターゲットを表す文字列です。例えば、もしOMakeが以下のコマンドラインで実行されたとしましょう。 ::
105 omake CFLAGS=1 foo bar.c
107 この場合、 ``TARGETS`` は ``foo bar.c`` が定義されます。
110 single: BUILD_SUMMARY
113 ^^^^^^^^^^^^^^^^^^^^^^^^^
114 ``BUILD_SUMMARY`` 変数は ``omake`` がビルド状況を要約したファイルが定義されています(メッセージはビルドの最後で出力されます)。ビルドが開始されたとき、このファイルは空です。あなたはビルド中にこのファイルを編集したり追加することで、ビルドの要約に何らかのメッセージを追加できます。
116 例えば、もしあなたがいくつかのアクションが発生した場所を把握しておきたいとしますと、ビルドの要約に以下を追加することで実現できます。 ::
119 echo "The file foo was built" >> $(BUILD_SUMMARY)
126 ^^^^^^^^^^^^^^^^^^^^^^^^^
127 いくつかのコマンドのメッセージが冗長に出力されます。デフォルトの値は ``false`` で、 ``--verbose`` オプションを用いてOMakeが実行された場合、変数の値は ``true`` となります。
131 9.2 論理式、真偽関数、コマンドのコントロール
132 -------------------------------------------------
133 omakeのブーリアン型は状況に無反応な(case-insensitive)文字列によって表現されます。「偽」は文字列 ``false`` , ``no`` , ``nil`` , ``undefined`` , ``0`` のいづれかによって表現されます。それ以外はすべて「真」となります。
140 ^^^^^^^^^^^^^^^^^^^^^^^^^
146 ``not`` 関数は真偽値を反転させます。
148 例えば、 ``$(not false)`` は ``true`` が返され、 ``$(not hello world)`` は ``false`` が返されます。
155 ^^^^^^^^^^^^^^^^^^^^^^^^^
156 ``equal`` 関数は2つの値が等しいかどうか比較します。
158 例えば、 ``$(equal a, b)`` は ``false`` が返され、 ``$(equal hello world, hello world)`` は ``true`` が返されます。
165 ^^^^^^^^^^^^^^^^^^^^^^^^^
168 $(and e1, ..., en) : String
169 e1, ..., en: Sequence
171 ``and`` 関数は引数の論理積を評価します。
173 例えば、以下のコードでは ``X`` は真で、 ``Y`` は偽となります。 ::
177 X = $(and $(equal $(A), a) true $(equal $(B), b))
178 Y = $(and $(equal $(A), a) true $(equal $(A), $(B)))
185 ^^^^^^^^^^^^^^^^^^^^^^^^^
188 $(or e1, ..., en) : String
189 e1, ..., en: String Sequence
192 ``or`` 関数は引数の選言を評価します。
194 例えば、以下のコードでは ``X`` は真で、 ``Y`` は偽となります。 ::
198 X = $(or $(equal $(A), a) false $(equal $(A), $(B)))
199 Y = $(or $(equal $(A), $(B)) $(equal $(A), b))
206 ^^^^^^^^^^^^^^^^^^^^^^^^^
209 $(if e1, e2[, e3]) : value
213 ``if`` 関数は真偽値を基にした条件分岐を行います。例えば、 ``$(if $(equal a, b), c, d)`` は ``d`` と評価されます。
215 条件分岐は以下のような文を用いても宣言できます。 ::
225 もし式 ``e1`` が偽でなかったら、 ``body1`` が評価され、結果は条件分岐の値として返されます。もし ``e1`` が偽であるなら、条件分岐は移り変わり ``e2`` の式が用いられます。もしどの条件式も真でなかった場合、 ``bodyn`` が評価され、結果は条件分岐の値として返されます。
227 ``if`` 文は任意の数の ``elseif`` 文を加えることができます。また、 ``else`` 文はなくても構いません。
231 各々の条件分岐文はそれぞれのスコープを持っているので、条件文中で定義された変数は通常外から見ることができません。 ``export`` コマンドはスコープ中で定義された変数をエクスポートするために用いられます。たとえば、以下の式はCコンパイラの設定を定義するために良く用いられる方法です。 ::
233 if $(equal $(OSTYPE), Win32)
248 ^^^^^^^^^^^^^^^^^^^^^^^^^
249 ``switch`` , ``match`` 関数はパターンのマッチングに用いられます。
251 ``$(switch <arg>, <pattern_1>, <value_1>, ..., <pattern_n>, <value_n>) $(match <arg>, <pattern_1>, <value_1>, ..., <pattern_n>, <value_n>)``
253 ``<pattern>/<value>`` の数は任意です。ただし、引数の数は必ず奇数でなければなりません。
255 ``<arg>`` は文字列として評価され、 ``<pattern_1>`` を用いて比較されます。もしマッチしている場合、結果の式は ``<value_1>`` が返されます。そうでない場合、マッチする文が見つかるまで、残りのパターンを用いて評価が行われます。
257 ``switch`` 関数はパターンと引数を比較するために用いられます。例えば、以下の表現式では、 ``FILE`` 変数は ``OSTYPE`` 変数の値に依存して、 ``foo`` , ``bar`` , あるいは空の文字列が定義されます。 ::
259 FILE = $(switch $(OSTYPE), Win32, foo, Unix, bar)
261 ``match`` 関数は正規表現を用います( ":ref:`label10.11.1`" を参照してください)。もしマッチしているパターンが見つかった場合、変数 ``$1, $2, ...`` は ``\(`` と ``\)`` デリミタの間にある文字列が束縛されます。 ``\0`` 変数は全体のマッチ文が定義されており、 ``$*`` はマッチした文字列の配列が定義されます。 ::
263 FILE = $(match foo_xyz/bar.a, foo_\\\(.*\\\)/\\\(.*\\\)\.a, foo_$2/$1.o)
265 ``switch`` と ``match`` 関数は代わりに(もっと便利な)以下のような形に書くことができます。 ::
276 式 ``e`` が前回のパターンでマッチせずに ``pattern_i`` でマッチした場合、 ``body_i`` が評価され、 ``match`` の結果として返されます。 ``switch`` 関数は文字列の比較を行います。 ``match`` 関数は正規表現でのマッチングを行います。 ::
279 case $".*\(\.[^\/.]*\)"
280 println(The string $(FILE) has suffix $1)
282 println(The string $(FILE) has no suffix)
289 ^^^^^^^^^^^^^^^^^^^^^^^^^
302 ``try`` 文は例外を扱うために用いられます。はじめに、 ``try-body`` の式が評価されます。
304 もし値 ``v`` が例外を出さなかった場合、 ``finally-body`` の式が評価され値 ``v`` が結果として返されます。
306 もし ``try-body`` の評価がオブジェクト ``obj`` の例外を送出した場合、 ``catch`` 文が代わりに評価されます。 ``catch`` 文の ``catch class(v)`` を実行している最中、もし例外のオブジェクト ``obj`` がクラス名 ``class`` のインスタンスであったならば、変数 ``v`` が例外のオブジェクトとして束縛され、 ``catch-body`` の式が評価されます。
308 もし ``catch`` 文が評価されている最中 ``when`` 文に遭遇した場合、評価式 ``expr`` が評価されます。もし結果が真であったならば、 ``when-body`` の式が続けて評価されます。さもなければ、次の ``catch`` 文が評価されます。
310 ``catch-body`` か ``when-body`` の評価が完全に終わった場合、別の ``when`` 文を評価することなく ``finally-body`` の式が評価され、値 ``v`` が返されます。
312 ``try`` 文には任意の数の ``catch`` 文を含めることができます。また、 ``finally`` 文はなくても構いません。
319 ^^^^^^^^^^^^^^^^^^^^^^^^^
320 ``raise`` 関数は例外を送出します。 ``exn`` は任意のオブジェクトです。しかしながら、通常は ``Exception`` オブジェクトを送出します。
322 もし例外が捕らえられなかった場合、全体のオブジェクトはエラーメッセージとして詳細に出力されます。しかしながら、もしオブジェクトが ``Exception`` で ``message`` プロパティを含んでいた場合、エラーメッセージは ``message`` のみが出力されます。
329 ^^^^^^^^^^^^^^^^^^^^^^^^^
335 ``exit`` 関数はomakeを異常終了させます。
339 ``exit`` 関数は終了コードである整数を引数に指定します。0でない値は異常終了を表します。
346 ^^^^^^^^^^^^^^^^^^^^^^^^^
349 $(defined sequence) : String
352 ``defined`` 関数はシーケンス中のすべての変数が現在定義されているか試します。例えば、以下のコードでは変数 ``X`` が既に定義されていないかどうかを定義しています。 ::
354 if $(not $(defined X))
358 これは修飾された変数にも用いることができます。 ::
364 single: defined-env()
368 ^^^^^^^^^^^^^^^^^^^^^^^^^
371 $(defined-env sequence) : String
374 ``defined-env`` 関数は処理している環境で、指定された変数が定義されているかどうか試します。
376 例えば、以下のコードでは、環境変数 ``DEBUG`` が定義されている場合は ``-g`` コンパイルオプションを追加します。 ::
378 if $(defined-env DEBUG)
387 ^^^^^^^^^^^^^^^^^^^^^^^^^
390 $(getenv name) : String
391 $(getenv name, default) : String
393 ``getenv`` 関数は現在処理している環境での変数の値を取得します。この関数は一つか二つの引数を指定する必要があります。
395 一つの引数を指定した場合、もし環境中で変数が定義されていなかったならば例外を送出します。二つの引数を指定した場合、もし定義されていなかったならば二番目の引数が返されます。
397 例えば、以下のコードでは、もし環境変数 ``PATH`` が定義されていた場合は、その値を空白で分割したリストとして ``X`` を定義します。さもなければ ``/bin /usr/bin`` が代わりに使われます。 ::
399 X = $(split $(PATHSEP), $(getenv PATH, /bin:/usr/bin))
401 あなたは以下のような形でも定義することができます。 ::
411 ^^^^^^^^^^^^^^^^^^^^^^^^^
418 ``setenv`` 関数は現在処理している環境での変数を定義します。環境変数は通常の変数のようにスコープされます。
425 ^^^^^^^^^^^^^^^^^^^^^^^^^
431 ``unsetenv`` 関数は現在処理している環境からいくつかの変数を削除します。環境変数は通常の変数のようにスコープされます。
434 single: get-registry()
438 ^^^^^^^^^^^^^^^^^^^^^^^^^
441 get-registry(hkey, key, field) : String
442 get-registry(hkey, key, field, default) : String
447 ``get-registry`` 関数はWin32上のシステムレジストリから文字列を取得します。他のアーキテクチャ上では、レジストリの値は返されません。
449 ``hive`` (私はこの呼び方が正しいと思っています)では、使用するレジストリの区分を指定します。これは以下の値である必要があります。(訳注: よく意味がわかりませんがhkeyとfiveをもじったもの?)
452 * HKEY_CURRENT_CONFIG
457 もしこれらの意味について知りたい場合はマイクロソフトのドキュメントを参照してください。
459 ``key`` はレジストリから取得したいフィールドを指定します。これは ``A\B\C`` のような形である必要があります(通常のスラッシュを用いた場合はバックスラッシュに変換されます)。 ``field`` は ``key`` のサブフィールドを指定します。
461 4つの引数を取る場合、 ``default`` の値が失敗したときに返されます。あなたはこれを別の形で用いることもできます。 ::
463 get-registry(hkey, key, field)
471 ^^^^^^^^^^^^^^^^^^^^^^^^^
474 $(getvar name) : String
476 ``getvar`` 関数は変数の値を取得します。
478 もし変数が定義されていない場合は例外が送出されます。
480 例えば、以下のコードでは ``X`` を文字列 ``abc`` で定義します。 ::
484 X = $(getvar $(NAME)_1)
486 これは修飾された変数にも使うことができます。 ::
495 ^^^^^^^^^^^^^^^^^^^^^^^^^
502 ``setvar`` 関数は新しい変数を定義します。例えば、以下のコードでは ``X`` は文字列 ``abc`` で定義されます。 ::
507 これは修飾された変数にも使うことができます。 ::
509 setvar(public.X, abc)
512 ----------------------------------
519 ^^^^^^^^^^^^^^^^^^^^^^^^^
522 $(array elements) : Array
525 ``array`` 関数はシーケンスから配列を生成します。もし ``<arg>`` が文字列だった場合、配列の成分はホワイトスペースによって区切られた文字列となります。また、クオートによっても区切られます。
527 加えて、配列の変数は以下のように宣言することができます。 ::
534 この場合、配列の成分は ``<val1>`` , ... , ``<valn>`` であり、ホワイトスペースは文字通りに取り扱われます。
541 ^^^^^^^^^^^^^^^^^^^^^^^^^
544 $(split sep, elements) : Array
548 ``split`` 関数は二つの引数を必要とし、一つめには文字列のデリミタ、二つめには区切りたい文字列を指定します。結果は ``elements`` シーケンスをセパレータによって区切った配列が返されます。
550 例えば以下のコードでは、変数 ``X`` は配列 ``/bin /usr/bin /usr/local/bin`` に定義されます。 ::
552 PATH = /bin:/usr/bin:/usr/local/bin
553 X = $(split :, $(PATH))
555 ``sep`` は除外することもできます。この場合 ``split`` はホワイトスペースで区切ります。クオーテーションは区切りません。
562 ^^^^^^^^^^^^^^^^^^^^^^^^^
565 $(concat sep, elements) : String
569 ``concat`` 関数は二つの引数を必要とし、一つめには文字列のセパレータ、二つめにはシーケンスを指定します。結果は隣接した成分の間にセパレータを配置した、結合された文字列が返されます。
571 例えば以下のコードでは、変数 ``X`` は文字列 ``foo_x_bar_x_baz`` に定義されます。 ::
574 Y = $(concat _x_, $(X))
581 ^^^^^^^^^^^^^^^^^^^^^^^^^
584 $(length sequence) : Int
587 ``length`` 関数は引数の成分の数を返します。
589 例えば、式 ``$(length a b "c d")`` は3と評価されます。
596 ^^^^^^^^^^^^^^^^^^^^^^^^^
599 $(nth i, sequence) : value
602 raises RuntimeException
604 ``nth`` 関数は引数のi番目の成分を返します。配列のインデックスは0から始まります。もしインデックスが存在しない成分を指定していた場合、例外が送出されます。
606 例えば、式 ``$(nth 1, a "b c" d)`` は ``"b c"`` と評価されます。
609 single: replace-nth()
613 ^^^^^^^^^^^^^^^^^^^^^^^^^
616 $(replace-nth i, sequence, x) : value
620 raises RuntimeException
622 ``replace-nth`` 関数はi番目の成分を新しい値 ``x`` に置き換えます。インデックスは0から始まります。もしインデックスが存在しない成分を指定していた場合、例外が送出されます。
624 例えば、式 ``$(replace-nth 1, a "b c" d, x)`` は ``a x d`` と評価されます。
631 ^^^^^^^^^^^^^^^^^^^^^^^^^
634 $(nth-hd i, sequence) : value
637 raises RuntimeException
639 ``nth-hd`` 関数は最初から ``i`` 個までの成分をもった配列を返します。もしシーケンスが ``i`` 個より少ない場合は例外が送出されます。
641 例えば、式 ``$(nth-hd 2, a "b c" d)`` は ``a "b c"`` と評価されます。
648 ^^^^^^^^^^^^^^^^^^^^^^^^^
651 $(nth-tl i, sequence) : value
654 raises RuntimeException
656 ``nth-tl`` 関数は最初から ``i`` 個までの成分を除いた、残りの配列を返します。もしシーケンスが ``i`` 個より少ない場合には例外が送出されます。
658 例えば、式 ``$(nth-tl 1, a "b c" d)`` は ``"b c" d`` と評価されます。
665 ^^^^^^^^^^^^^^^^^^^^^^^^^
668 $(subrange off, len, sequent) : value
672 raises RuntimeException
674 ``subrange`` 関数はシーケンスの一部分を返します。インデックスは0から始まります。もし指定された範囲に成分が存在しない場合には例外が送出されます。
676 例えば、式 ``$(subrange 1, 2, a "b c" d e)`` は ``"b c" d`` と評価されます。
683 ^^^^^^^^^^^^^^^^^^^^^^^^^
686 $(rev sequence) : Sequence
689 ``rev`` 関数は指定された配列の順番を逆にした配列を返します。例えば、式 ``$(rev a "b c" d)`` は ``d "b c" a`` と評価されます。
696 ^^^^^^^^^^^^^^^^^^^^^^^^^
699 $(join sequence1, sequence2) : Sequence
703 ``join`` 関数は二つのシーケンスの成分を互いに結合させます。例えば、 ``$(join a b c, .c .cpp .h)`` は ``a.c b.cpp c.h`` と評価されます。もし二つの入力シーケンスが異なる長さであった場合は、長いシーケンスの残りの成分は、出力先の配列の終わりに修正されない状態でコピーされます。
710 ^^^^^^^^^^^^^^^^^^^^^^^^^
713 $(string sequence) : String
716 ``string`` 関数はシーケンスを一つの文字列にまとめます。これは ``concat`` 関数と似ていますが、この成分はホワイトスペースによって分割されています。結果は一つのユニットとして扱われます。ホワイトスペースは重要です。
719 single: string-length()
723 ^^^^^^^^^^^^^^^^^^^^^^^^^
726 $(string-length sequence) : Int
729 ``string-length`` 関数は引数の文字列の長さを返します。もし引数がシーケンスであった場合、まとめられた状態で評価されます。よって、 ``$(string-length sequence)`` は ``$(string-length $(string sequence))`` と等価です。
732 single: string-escaped()
733 single: ocaml-escaped()
734 single: html-escaped()
735 single: html-pre-escaped()
740 9.3.14 string-escaped, ocaml-escaped, html-escaped, html-pre-escaped, c-escaped, id-escaped
741 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
744 $(string-escaped sequence) : String Array
745 $(ocaml-escaped sequence) : String Array
746 $(html-escaped sequence) : String Array
747 $(html-pre-escaped sequence) : String Array
748 $(c-escaped sequence) : String Array
749 $(hex-escaped sequence) : StringArray
752 ``string-escaped`` 関数は引数の各々の成分を文字列に変換し、もしその成分がOMakeの特殊文字を含んでいた場合は、その文字をエスケープした状態で返します。特殊文字は ``:()\,$'"#`` とホワイトスペースを含みます。この関数はスキャナルール中で、 ``stdout`` に出力する前にファイル名をエスケープするために使われます。
754 ``ocaml-escaped`` 関数はOCamlの特殊文字をエスケープした状態で返します。
756 ``c-escaped`` 関数はCの文字定数に使われるような形の文字列に変換します。
758 ``id-escaped`` 関数はOMakeで使われるような識別子に変換します。
760 ``html-escaped`` 関数はHTMLで文字通りに読み込まれるような形の文字列に変換します。 ``html-pre-escaped`` 関数と似ていますが、この関数では改行は ``<br>`` に変換されません。 ::
762 println($(string $(string-escaped $"a b" $"y:z")))
770 9.3.15 decode-uri, encode-uri
771 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
774 $(decode-uri sequence) : sequence
777 これら二つの関数はURIのエンコーディングに用いられ、特殊文字を16進数の文字に置き換えます。 ::
779 osh> s = $(encode-uri $'a b~c')
789 ^^^^^^^^^^^^^^^^^^^^^^^^^
792 $(quote sequence) : String
795 ``quote`` 関数はシーケンスを一つの文字列にまとめ、さらに文字列にクオートを付与します。内部のクオーテーションはエスケープされます。
797 例えば、式 ``$(quote a "b c" d)`` は ``"a \"b c\" d"`` に、 ``$(quote abc)`` は ``"abc"`` に評価されます。
804 ^^^^^^^^^^^^^^^^^^^^^^^^^
807 $(quote-argv sequence) : String
810 ``quote-argv`` 関数はシーケンスを一つの文字列にまとめ、さらに文字列にクオートを付与します。The quotation is formed so that a command-line parse can separate the string back into its components.
813 single: html-string()
817 ^^^^^^^^^^^^^^^^^^^^^^^^^
820 $(html-string sequence) : String
823 ``html-string`` 関数はシーケンスを一つの文字列にまとめ、さらに特殊なHTML文字にエスケープします。 ``concat`` 関数と似ていますが、この関数はホワイトスペースで分割を行います。結果は一つの文字列として返されます。
830 ^^^^^^^^^^^^^^^^^^^^^^^^^
833 $(addsuffix suffix, sequence) : Array
837 ``addsuffix`` 関数はシーケンスの各々の成分に接尾辞を付与します。返される配列の長さは、指定されたシーケンスの配列の長さと全く同じです。
839 例えば、 ``$(addsuffix .c, a b "c d")`` は ``a.c b.c "c d".c`` と評価されます。
846 ^^^^^^^^^^^^^^^^^^^^^^^^^
849 $(mapsuffix suffix, sequence) : Array
853 ``mapsuffix`` 関数はシーケンスの各々の成分に接尾辞を付与します。これは ``addsuffix`` 関数と似ていますが、この関数は文字列をくっ付ける代わりに新しく成分を追加します。よって、返される配列の長さは、指定されたシーケンスの配列の長さの2倍です。
855 例えば、 ``$(mapsuffix .c, a b "c d")`` は ``a .c b .c "c d" .c`` と評価されます。
858 single: addsuffixes()
862 ^^^^^^^^^^^^^^^^^^^^^^^^^
865 $(addsuffixes suffixes, sequence) : Array
869 ``addsuffixes`` 関数は最初の引数に指定されたすべての接尾辞をシーケンスの各々の成分に付与します。もし ``suffixes`` が ``n`` 個の成分を、 ``sequence`` が ``m`` 個の成分を持っていた場合、結果は ``n * m`` 個の成分を持ったシーケンスが返されます。
871 例えば、 ``$(addsuffixes .c .o, a b c)`` は ``a.c a.o b.c b.o c.c c.o`` と評価されます。
874 single: removeprefix()
878 ^^^^^^^^^^^^^^^^^^^^^^^^^
881 $(removeprefix prefix, sequence) : Array
885 ``removeprefix`` 関数はシーケンスの各々の成分から接頭辞を取り除きます。
888 single: removesuffix()
892 ^^^^^^^^^^^^^^^^^^^^^^^^^
895 $(removesuffix sequence) : Array
898 ``removesuffix`` 関数はシーケンスの各々の成分から接尾辞を取り除きます。
900 例えば、 ``$(removesuffix a.c b.foo "c d")`` の結果は ``a b "c d"`` となります。
903 single: replacesuffixes()
906 9.3.24 replacesuffixes
907 ^^^^^^^^^^^^^^^^^^^^^^^^^
910 $(replacesuffixes old-suffixes, new-suffixes, sequence) : Array
911 old-suffixes : Sequence
912 new-suffixes : Sequence
915 ``replacesuffixes`` 関数はシーケンスの各々の成分の接尾辞を置き換えます。 ``old-suffixes`` と ``new-suffixes`` シーケンスは同じ長さである必要があります。
917 例えば、 ``$(replacesuffixes .h .c, .o .o, a.c b.h c.z)`` の結果は ``a.o b.o c.z`` となります。
924 ^^^^^^^^^^^^^^^^^^^^^^^^^
927 $(addprefix prefix, sequence) : Array
931 ``addprefix`` 関数はシーケンスの各々の成分に接頭辞を付与します。返される配列の長さは、指定されたシーケンスの配列の長さと全く同じです。
933 例えば、 ``$(addprefix foo/, a b "c d")`` は ``foo/a foo/b foo/"c d"`` と評価されます。
940 ^^^^^^^^^^^^^^^^^^^^^^^^^
943 $(mapprefix prefix, sequence) : Array
947 ``mapprefix`` 関数はシーケンスの各々の成分に接頭辞を付与します。これは ``addprefix`` 関数と似ていますが、この関数は文字列をくっ付ける代わりに新しく成分を追加します。よって、返される配列の長さは、指定されたシーケンスの配列の長さの2倍です。
949 例えば、 ``$(mapprefix foo, a b "c d")`` の結果は ``foo a foo b foo "c d"`` となります。
952 single: add-wrapper()
956 ^^^^^^^^^^^^^^^^^^^^^^^^^
959 $(add-wrapper prefix, suffix, sequence) : Array
964 ``add-wrapper`` 関数はシーケンスの各々の成分に接頭辞と接尾辞の両方を付与します。例えば、 ``$(add-wrapper dir/, .c, a b)`` は ``dir/a.c dir/b.c`` と評価されます。文字列は結合されるため、返される配列の長さは、指定されたシーケンスの長さと全く同じです。
971 ^^^^^^^^^^^^^^^^^^^^^^^^^
974 $(set sequence) : Array
977 ``set`` 関数は文字列の集合をソートします。さらに、重複した成分は除去します。
979 例えば、 ``$(set z y z "m n" w a)`` の結果は ``"m n" a w y z`` となります。
986 ^^^^^^^^^^^^^^^^^^^^^^^^^
989 $(mem elem, sequence) : Boolean
993 ``mem`` 関数はシーケンス中に指定した成分が含まれているかどうか調べます。
995 例えば、 ``$(mem "m n", y z "m n" w a)`` は ``true`` と評価され、一方で ``$(mem m n, y z "m n" w a)`` は ``false`` と評価されます。
998 single: intersection()
1002 ^^^^^^^^^^^^^^^^^^^^^^^^^
1005 $(intersection sequence1, sequence2) : Array
1006 sequence1 : Sequence
1007 sequence2 : Sequence
1009 ``intersection`` 関数は指定された二つの集合の和をとります。返される配列の長さは不定であり、重複があればそれを含みます。もし結果をソートし、さらに重複を除きたい場合は ``set`` 関数を使ってください。
1011 例えば、 ``$(intersection c a b a, b a)`` は ``a b a`` と評価されます。
1014 single: intersects()
1018 ^^^^^^^^^^^^^^^^^^^^^^^^^
1021 $(intersects sequence1, sequence2) : Boolean
1022 sequence1 : Sequence
1023 sequence2 : Sequence
1025 ``intersects`` 関数は二つの集合の和が空集合でないかどうか調べます。これは集合の和を計算し、空であるかどうか調べるよりも少しだけ効率的です。
1027 例えば、 ``$(intersects a b c, d c e)`` は ``true`` と評価され、 ``$(intersects a b c a, d e f)`` は ``false`` と評価されます。
1034 ^^^^^^^^^^^^^^^^^^^^^^^^^
1037 $(set-diff sequence1, sequence2) : Array
1038 sequence1 : Sequence
1039 sequence2 : Sequence
1041 ``set-diff`` 関数は二つの集合の差異を計算します。結果は ``sequence1`` には含まれるが ``sequence2`` には含まれていない成分からなる配列です。返される配列の長さは不定であり、重複があればそれを含みます。もし結果をソートし、さらに重複を除きたい場合は ``set`` 関数を使ってください。
1042 (訳注: この関数は集合論における ``f(A,B) = A - B`` と等価です。)
1044 例えば、 ``$(set-diff c a b a e, b a)`` は ``c e`` と評価されます。
1051 ^^^^^^^^^^^^^^^^^^^^^^^^^
1054 $(set-diff sequence1, sequence2) : Array
1055 sequence1 : Sequence
1056 sequence2 : Sequence
1058 ``filter`` 関数はシーケンスから特定の成分を抜き出します。 ``patterns`` にはパターンを定義した、空でないシーケンスを指定します。また、パターンにはワイルドカード ``%`` を含めることができます。
1060 例えば、 ``$(filter %.h %.o, a.c x.o b.h y.o "hello world".c)`` は ``x.o b.h y.o`` と評価されます。
1063 single: filter-out()
1067 ^^^^^^^^^^^^^^^^^^^^^^^^^
1070 $(filter-out patterns, sequence) : Array
1074 ``filter-out`` 関数はシーケンスから特定の成分を除去します。 ``patterns`` にはパターンを定義した、空でないシーケンスを指定します。また、パターンにはワイルドカード ``%`` を含めることができます。
1076 例えば、 ``$(filter-out %.c %.h, a.c x.o b.h y.o "hello world".c)`` は ``x.o y.o`` と評価されます。
1079 single: capitalize()
1083 ^^^^^^^^^^^^^^^^^^^^^^^^^
1086 $(capitalize sequence) : Array
1089 ``capitalize`` 関数はシーケンスの各々の成分の単語を大文字化します。例えば、 ``$(capitalize through the looking Glass)`` は ``Through The Looking Glass`` と評価されます。
1092 single: uncapitalize()
1096 ^^^^^^^^^^^^^^^^^^^^^^^^^
1099 $(uncapitalize sequence) : Array
1102 ``uncapitalize`` 関数は引数に指定された各々の単語を小文字化します。
1104 例えば、 ``$(uncapitalize through the looking Glass)`` は ``through the looking glass`` と評価されます。
1111 ^^^^^^^^^^^^^^^^^^^^^^^^^
1114 $(uppercase sequence) : Array
1117 ``uppercase`` 関数はシーケンス中の文字すべてを大文字化します。例えば、 ``$(uppercase through the looking Glass)`` は ``THROUGH THE LOOKING GLASS`` と評価されます。
1124 ^^^^^^^^^^^^^^^^^^^^^^^^^
1127 $(lowercase sequence) : Array
1130 ``lowercase`` 関数はシーケンス中の文字すべてを小文字化します。例えば、 ``$(lowercase through tHe looking Glass)`` は ``through the looking glass`` と評価されます。
1137 ^^^^^^^^^^^^^^^^^^^^^^^^^
1143 ``system`` 関数はシェル上のコマンドを評価するために用いられます。シェルコマンドを評価するため、omakeは内部でこの関数を使用しています。
1145 例えば、以下のプログラムは式 ``system(ls foo)`` と等価です。 ::
1154 ^^^^^^^^^^^^^^^^^^^^^^^^^
1157 $(shell command) : Array
1158 $(shella command) : Array
1159 $(shell-code command) : Int
1162 ``shell`` 関数はシェルコマンドを用いてコマンドを評価し、さらに標準出力先に出力された、ホワイトスペースで区切ってある出力結果を返します。
1164 ``shella`` 関数は同様に振る舞いますが、この関数では改行をそのまま出力するのではなく、分割された配列として返します。
1166 ``shell-code`` は結果として終了コードを返します。出力は返されません。
1168 例えば、もしカレントディレクトリがファイル ``OMakeroot`` , ``OMakefile`` , ``hello.c`` を含んでいる場合、 ``$(shell ls)`` はUnixシステム上では ``hello.c OMakefile OMakeroot`` と評価されます。
1175 ^^^^^^^^^^^^^^^^^^^^^^^^^
1176 ``export`` 関数は現在の環境中の変数の値を保存します。
1178 例えば、以下のコードは ``1 1 2`` と出力されます。 ::
1183 SAVE_ENV = $(export A B)
1190 この関数に引数を指定することは、 ``export`` 文を用いて引数を指定するのと全く等価なものとして解釈されます(詳細は ":ref:`label6.3`" を参照してください)。
1197 ^^^^^^^^^^^^^^^^^^^^^^^^^
1214 ``<test>`` が真である間はずっとループの式が実行されます。最初の形では、 ``<body>`` はすべてのループにおいて実行されます。二番目の形では、もし ``<testI>`` が真であった場合は ``<bodyI>`` が実行されます。もしなにも当てはまらない場合には ``<bodyd>`` が実行されます。もしすべての場合において真でなかったならば、ループは終了します。なお、ループ中の環境は自動的にエクスポートされます。
1216 例えば、 ``i`` を ``0`` から ``9`` まで繰り返します。 ::
1231 以下の例は似ていますが、いくつかの特殊な場合においてある文字が出力されます。その他は値が出力されます。 ::
1242 ``break`` 関数は ``while`` ループを早期に抜けたい場合に用いられます。
1249 ^^^^^^^^^^^^^^^^^^^^^^^^^
1254 最も近いループから抜け出し、現在の状態を返します。
1258 single: random-init()
1261 9.3.44 random, random-init
1262 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1269 乱数を生成します。値は疑似乱数で、暗号として用いられるほどセキュアではありません。
1271 乱数生成器はシステムの乱数器を用いて初期化します。よって、次にプログラムを走らせたときの乱数の値は前回と異なります。 ``ramdom-init`` 関数は特定の値を用いて乱数生成器を初期化します。
1276 ----------------------------------
1283 ^^^^^^^^^^^^^^^^^^^^^^^^^
1284 ``int`` 関数は整数値を作るために用いられ、 ``Int`` オブジェクトを返します。 ::
1293 ^^^^^^^^^^^^^^^^^^^^^^^^^
1294 ``float`` 関数は浮動小数点値を作るために用いられ、 ``Float`` オブジェクトを返します。 ::
1317 ^^^^^^^^^^^^^^^^^^^^^^^^^
1318 以下の関数は基本的な数学の演算を行います。
1320 * ``$(neg <numbers>)`` : 数学的な反転
1321 * ``$(add <numbers>)`` : 加算
1322 * ``$(sub <numbers>)`` : 減算
1323 * ``$(mul <numbers>)`` : 乗算
1324 * ``$(div <numbers>)`` : 除算
1325 * ``$(mod <numbers>)`` : 余り
1326 * ``$(lnot <numbers>)`` : ビット単位NOT
1327 * ``$(land <numbers>)`` : ビット単位AND
1328 * ``$(lor <numbers>)`` : ビット単位OR
1329 * ``$(lxor <numbers>)`` : ビット単位XOR
1330 * ``$(lsl <numbers>)`` : 論理左シフト
1331 * ``$(lsr <numbers>)`` : 論理右シフト
1332 * ``$(asr <numbers>)`` : 算術右シフト
1333 * ``$(min <numbers>)`` : 最も小さい成分
1334 * ``$(max <numbers>)`` : 最も大きい成分
1350 ^^^^^^^^^^^^^^^^^^^^^^^^^
1353 * ``$(lt <numbers>)`` : ~より少ない (A < B)
1354 * ``$(le <numbers>)`` : ~以下 (A <= B)
1355 * ``$(eq <numbers>)`` : 等しい (A == B)
1356 * ``$(ge <numbers>)`` : ~以上 (A >= B)
1357 * ``$(gt <numbers>)`` : ~より多い (A > B)
1358 * ``$(ult <numbers>)`` : ~より少ない(符号なし)
1359 * ``$(ule <numbers>)`` : ~以下(符号なし)
1360 * ``$(uge <numbers>)`` : ~以上(符号なし)
1361 * ``$(ugt <numbers>)`` : ~より多い(符号なし)
1363 (訳注: ここでいう(符号なし)とは符号ビットを考慮しないで評価を行うことを表しています。例えば、int型とunsigned int型では同じビット数に対してそれぞれ表している数値が異なります。(符号なし)の演算子はこのような場合に用いられます。)
1368 ----------------------------------
1375 ^^^^^^^^^^^^^^^^^^^^^^^^^
1376 ``fun`` 関数は匿名関数を生成します。 ::
1378 $(fun <v1>, ..., <vn>, <body>)
1380 最後の引数は関数の内容を記述します。他の引数はパラメータ名を指定します。
1382 例えば、以下の3つの関数定義は等価です。 ::
1385 return($(addsuffix $(Y), $(X)))
1387 F = $(fun X, Y, $(addsuffix $(Y), $(X)))
1391 value $(addsuffix $(Y), $(X))
1398 ^^^^^^^^^^^^^^^^^^^^^^^^^
1399 ``apply`` 関数は関数に値を適用します。 ::
1401 $(apply <fun>, <args>)
1403 以下の関数定義を行った場合について考えてみましょう。 ::
1406 return($(addsuffix $(Y), $(X)))
1411 X = $(apply $(F), a b c, .c)
1418 ^^^^^^^^^^^^^^^^^^^^^^^^^
1419 ``applya`` 関数は引数の配列を関数に適用します。 ::
1421 $(applya <fun>, <args>)
1423 例えば、以下のプログラムでは ``Z`` の値は ``file.c`` となります。 ::
1426 return($(addsuffix $(Y), $(X)))
1430 Z = $(applya $(F), $(args))
1433 single: create-map()
1434 single: create-lazy-map()
1437 9.5.4 create-map, create-lazy-map
1438 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1439 ``create-map`` 関数は簡単に ``Map`` オブジェクトを作る関数です。 ``create-map`` 関数はキー/値のペアを引数によって指定するので、引数の数は等しくなければなりません。例えば、以下の2つの式は等価です。 ::
1441 X = $(create-map name1, xxx, name2, yyy)
1448 ``create-lazy-map`` 関数は ``create-map`` と似ていますが、この関数は値が遅延評価されます。例えば、以下の2つの式は等価です。 ::
1450 Y = $(create-lazy-map name1, $(xxx), name2, $(yyy))
1457 ``create-lazy-map`` 関数はルールを生成する際に用いられます。
1462 ----------------------------------
1469 ^^^^^^^^^^^^^^^^^^^^^^^^^
1470 ``foreach`` 関数はシーケンスすべての成分にわたって関数を適用します。 ::
1472 $(foreach <fun>, <args>)
1474 foreach(<var>, <args>)
1477 例えば、以下のプログラムでは変数 ``X`` は配列 ``a.c b.c c.c`` と定義されます。 ::
1484 X = $(foreach $(fun x, $(x).c), abc)
1488 ``export`` 文は ``foreach`` の内容に使うこともできます。例えば、以下の式の ``X`` は最終的に ``a.c b.c c.c`` となります。 ::
1495 ``break`` 関数はこのようなループを早期に抜けたい場合に用いられます。
1500 ----------------------------------
1503 single: sequence-forall()
1506 9.7.1 sequence-forall
1507 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1508 ``forall`` 関数は ``<body>`` がシーケンスのすべての成分に当てはまっているかどうか調べます。 ::
1510 $(sequence-forall <fun>, <args>)
1512 sequence-forall(<var> => ..., <args>)
1516 single: sequence-forall()
1519 9.7.2 sequence-exists
1520 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1521 ``exists`` 関数は ``<body>`` がシーケンスのいくつかの成分に当てはまっているかどうか調べます。 ::
1523 $(sequence-exists <fun>, <args>)
1525 sequence-exists(<var> => ..., <args>)
1529 single: sequence-sort()
1533 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1534 ``sort`` 関数は配列の成分を与えられた評価関数を元にソートします。評価関数は二つの引数(x, y)を取ります。もしx < yであった場合、評価関数は負の値を返す必要があります。同様に、x > yの場合は正の値、x = yの場合は0を返します。 ::
1536 $(sequence-sort <fun>, <args>)
1538 sort(<var>, <var> => ..., <args>)
1546 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1547 ``compare`` 関数は二つの値(x, y)を比較します。もしx < yであった場合、この関数は負の値を返します。同様に、x > yの場合は正の値、x = yの場合は0を返します。 ::
1549 $(compare x, y) : Int