OSDN Git Service

10.6まで翻訳完了.
[omake-japanese/omake_trans.git] / base.rst
1 .. 9-base
2
3 .. _label9:
4
5 9. 基本ライブラリ
6 ==================================
7
8 .. _label9.1:
9
10 9.1 ビルドイン変数
11 ----------------------------------
12
13 .. index::
14    single: OMAKE_VERSION
15
16 OMAKE_VERSION
17 ^^^^^^^^^^^^^^^^^^^^^^^^^
18 OMakeのバージョンを表します。
19
20 STDLIB
21 ^^^^^^^^^^^^^^^^^^^^^^^^^
22 OMakeの基本ライブラリのファイルがあるディレクトリを表します。起動時に、この変数のデフォルトの値は以下のようにして決定されます。
23
24 * OMAKELIB環境変数の値が存在している場合は用いられます。ただし、値は絶対パスでなければなりません。
25 * Windows上では、レジストリのキー ``HKEY_CURRENT_USER\SOFTWARE\MetaPRL\OMake\OMAKELIB`` と ``HKEY_LOCAL_MACHINE\SOFTWARE\MetaPRL\OMake\OMAKELIB`` が調べられ、もし存在している場合にはその値が用いられます。
26 * さもなければコンパイルされた時の値が用いられます。
27
28 現在のデフォルトの値は ``omake --version`` を走らせることによって参照できます。
29
30 .. index::
31    single: OMAKE_PATH
32
33 OMAKEPATH
34 ^^^^^^^^^^^^^^^^^^^^^^^^^
35 ``include`` と ``open`` 文における検索パスを指定した、ディレクトリの配列です(詳細は4.7を参照してください)。
36 デフォルトの値は ``.`` と ``$(STDLIB)`` が格納されています。
37
38 OSTYPE
39 ^^^^^^^^^^^^^^^^^^^^^^^^^
40 omakeを走らせているマシンのアーキテクチャの集合です。考えられる値は ``Unix`` (LinuxやMac OS Xを含む、すべてのUnixのバージョンを表します), ``Win32`` (MS-Windowsでは、OMakeはMSVC++かMingwを用いてコンパイルします), ``Cygwin`` (MS-Windowsでは、OMakeはCygwinを用いてコンパイルします)があります。
41
42 .. index::
43    single: SYSNAME
44
45 SYSNAME
46 ^^^^^^^^^^^^^^^^^^^^^^^^^
47 現在のマシンのOSの名前を表します。
48
49 .. index::
50    single: NODENAME
51
52 NODENAME
53 ^^^^^^^^^^^^^^^^^^^^^^^^^
54 現在のマシンのホスト名を表します。
55
56 .. index::
57    single: OS_VERSION
58
59 OS_VERSION
60 ^^^^^^^^^^^^^^^^^^^^^^^^^
61 OSのバージョンを表します。
62
63 .. index::
64    single: MACHINE
65
66 MACHINE
67 ^^^^^^^^^^^^^^^^^^^^^^^^^
68 マシンのアーキテクチャを表します(例: ``i386`` , ``sparc`` , etc...)。
69
70 .. index::
71    single: HOST
72
73 HOST
74 ^^^^^^^^^^^^^^^^^^^^^^^^^
75 ``NODENAME`` と等価です。
76
77 .. index::
78    single: USER
79
80 USER
81 ^^^^^^^^^^^^^^^^^^^^^^^^^
82 処理を実行しているユーザのログイン名を表します。
83
84 .. index::
85    single: HOME
86
87 HOME
88 ^^^^^^^^^^^^^^^^^^^^^^^^^
89 処理を実行しているユーザのホームディレクトリを表します。
90
91 .. index::
92    single: PID
93
94 PID
95 ^^^^^^^^^^^^^^^^^^^^^^^^^
96 OMakeのプロセスIDを表します。
97
98 .. index::
99    single: TARGETS
100
101 TARGETS
102 ^^^^^^^^^^^^^^^^^^^^^^^^^
103 コマンドラインのターゲットを表す文字列です。例えば、もしOMakeが以下のコマンドラインで実行されたとしましょう。 ::
104
105       omake CFLAGS=1 foo bar.c
106
107 この場合、 ``TARGETS`` は ``foo bar.c`` が定義されます。
108
109 .. index::
110    single: BUILD_SUMMARY
111
112 BUILD_SUMMARY
113 ^^^^^^^^^^^^^^^^^^^^^^^^^
114 ``BUILD_SUMMARY`` 変数は ``omake`` がビルド状況を要約したファイルが定義されています(メッセージはビルドの最後で出力されます)。ビルドが開始されたとき、このファイルは空です。あなたはビルド中にこのファイルを編集したり追加することで、ビルドの要約に何らかのメッセージを追加できます。
115
116 例えば、もしあなたがいくつかのアクションが発生した場所を把握しておきたいとしますと、ビルドの要約に以下を追加することで実現できます。 ::
117
118    foo: boo
119        echo "The file foo was built" >> $(BUILD_SUMMARY)
120        ...build foo...
121
122 .. index::
123    single: VERBOSE
124
125 VERBOSE
126 ^^^^^^^^^^^^^^^^^^^^^^^^^
127 いくつかのコマンドのメッセージが冗長に出力されます。デフォルトの値は ``false`` で、 ``--verbose`` オプションを用いてOMakeが実行された場合、変数の値は ``true`` となります。
128
129 .. _label9.2:
130
131 9.2 論理式、真偽関数、コマンドのコントロール
132 -------------------------------------------------
133 omakeのブーリアン型は状況に無反応な(case-insensitive)文字列によって表現されます。「偽」は文字列 ``false`` , ``no`` , ``nil`` , ``undefined`` , ``0`` のいづれかによって表現されます。それ以外はすべて「真」となります。
134
135 .. index::
136    single: not()
137 .. _label9.2.1:
138
139 9.2.1 not
140 ^^^^^^^^^^^^^^^^^^^^^^^^^
141 ::
142
143    $(not e) : String
144       e : String
145
146 ``not`` 関数は真偽値を反転させます。
147
148 例えば、 ``$(not false)`` は ``true`` が返され、 ``$(not hello world)`` は ``false`` が返されます。
149
150 .. index::
151    single: equal()
152 .. _label9.2.2:
153
154 9.2.2 equal
155 ^^^^^^^^^^^^^^^^^^^^^^^^^
156 ``equal`` 関数は2つの値が等しいかどうか比較します。
157
158 例えば、 ``$(equal a, b)`` は ``false`` が返され、 ``$(equal hello world, hello world)`` は ``true`` が返されます。
159
160 .. index::
161    single: and()
162 .. _label9.2.3:
163
164 9.2.3 and
165 ^^^^^^^^^^^^^^^^^^^^^^^^^
166 ::
167
168     $(and e1, ..., en) : String
169        e1, ..., en: Sequence
170
171 ``and`` 関数は引数の論理積を評価します。
172
173 例えば、以下のコードでは ``X`` は真で、 ``Y`` は偽となります。 ::
174
175     A = a
176     B = b
177     X = $(and $(equal $(A), a) true $(equal $(B), b))
178     Y = $(and $(equal $(A), a) true $(equal $(A), $(B)))
179
180 .. index::
181    single: or()
182 .. _label9.2.4:
183
184 9.2.4 or
185 ^^^^^^^^^^^^^^^^^^^^^^^^^
186 ::
187
188    $(or e1, ..., en) : String
189       e1, ..., en: String Sequence
190
191
192 ``or`` 関数は引数の選言を評価します。
193
194 例えば、以下のコードでは ``X`` は真で、 ``Y`` は偽となります。 ::
195
196     A = a
197     B = b
198     X = $(or $(equal $(A), a) false $(equal $(A), $(B)))
199     Y = $(or $(equal $(A), $(B)) $(equal $(A), b))
200
201 .. index::
202    single: if()
203 .. _label9.2.5:
204
205 9.2.5 if
206 ^^^^^^^^^^^^^^^^^^^^^^^^^
207 ::
208
209     $(if e1, e2[, e3]) : value
210        e1 : String
211        e2, e3 : value
212
213 ``if`` 関数は真偽値を基にした条件分岐を行います。例えば、 ``$(if $(equal a, b), c, d)`` は ``d`` と評価されます。
214
215 条件分岐は以下のような文を用いても宣言できます。 ::
216
217    if e1
218       body1
219    elseif e2
220       body2
221    ...
222    else
223       bodyn
224
225 もし式 ``e1`` が偽でなかったら、 ``body1`` が評価され、結果は条件分岐の値として返されます。もし ``e1`` が偽であるなら、条件分岐は移り変わり ``e2`` の式が用いられます。もしどの条件式も真でなかった場合、 ``bodyn`` が評価され、結果は条件分岐の値として返されます。
226
227 ``if`` 文は任意の数の ``elseif`` 文を加えることができます。また、 ``else`` 文はなくても構いません。
228
229
230 .. note::
231   各々の条件分岐文はそれぞれのスコープを持っているので、条件文中で定義された変数は通常外から見ることができません。 ``export`` コマンドはスコープ中で定義された変数をエクスポートするために用いられます。たとえば、以下の式はCコンパイラの設定を定義するために良く用いられる方法です。 ::
232
233    if $(equal $(OSTYPE), Win32)
234       CC = cl
235       CFLAGS += /DWIN32
236       export
237    else
238       CC = gcc
239       CFLAGS += -g -O2
240       export
241
242 .. index::
243    single: switch()
244    single: match()
245 .. _label9.2.6:
246
247 9.2.6 switch, match
248 ^^^^^^^^^^^^^^^^^^^^^^^^^
249 ``switch`` , ``match`` 関数はパターンのマッチングに用いられます。
250
251 ``$(switch <arg>, <pattern_1>, <value_1>, ..., <pattern_n>, <value_n>) $(match <arg>, <pattern_1>, <value_1>, ..., <pattern_n>, <value_n>)``
252
253 ``<pattern>/<value>`` の数は任意です。ただし、引数の数は必ず奇数でなければなりません。
254
255 ``<arg>`` は文字列として評価され、 ``<pattern_1>`` を用いて比較されます。もしマッチしている場合、結果の式は ``<value_1>`` が返されます。そうでない場合、マッチする文が見つかるまで、残りのパターンを用いて評価が行われます。
256
257 ``switch`` 関数はパターンと引数を比較するために用いられます。例えば、以下の表現式では、 ``FILE`` 変数は ``OSTYPE`` 変数の値に依存して、 ``foo`` , ``bar`` , あるいは空の文字列が定義されます。 ::
258
259     FILE = $(switch $(OSTYPE), Win32, foo, Unix, bar)
260
261 ``match`` 関数は正規表現を用います( ``grep`` 関数を参照してください)。もしマッチしているパターンが見つかった場合、変数 ``$1, $2, ...`` は ``\(`` と ``\)`` デリミタの間にある文字列が束縛されます。 ``\0`` 変数は全体のマッチ文が定義されており、 ``$*`` はマッチした文字列の配列が定義されます。 ::
262
263     FILE = $(match foo_xyz/bar.a, foo_\\\(.*\\\)/\\\(.*\\\)\.a, foo_$2/$1.o)
264
265 ``switch`` と ``match`` 関数は代わりに(もっと便利な)以下のような形に書くことができます。 ::
266
267    match e
268    case pattern1
269       body1
270    case pattern2
271       body2
272    ...
273    default
274       bodyd
275
276 式 ``e`` が前回のパターンでマッチせずに ``pattern_i`` でマッチした場合、 ``body_i`` が評価され、 ``match`` の結果として返されます。 ``switch`` 関数は文字列の比較を行います。 ``match`` 関数は正規表現でのマッチングを行います。 ::
277
278    match $(FILE)
279    case $".*\(\.[^\/.]*\)"
280       println(The string $(FILE) has suffix $1)
281    default
282       println(The string $(FILE) has no suffix)
283
284 .. index::
285    single: try
286 .. _label9.2.7:
287
288 9.2.7 try
289 ^^^^^^^^^^^^^^^^^^^^^^^^^
290 ::
291
292    try
293       try-body
294    catch class1(v1)
295       catch-body
296    when expr
297       when-body
298    ...
299    finally
300       finally-body
301
302 ``try`` 文は例外を扱うために用いられます。はじめに、 ``try-body`` の式が評価されます。
303
304 もし値 ``v`` が例外を出さなかった場合、 ``finally-body`` の式が評価され値 ``v`` が結果として返されます。
305
306 もし ``try-body`` の評価がオブジェクト ``obj`` の例外を送出した場合、 ``catch`` 文が代わりに評価されます。 ``catch`` 文の ``catch class(v)`` を実行している最中、もし例外のオブジェクト ``obj`` がクラス名 ``class`` のインスタンスであったならば、変数 ``v`` が例外のオブジェクトとして束縛され、 ``catch-body`` の式が評価されます。
307
308 もし ``catch`` 文が評価されている最中 ``when`` 文に遭遇した場合、評価式 ``expr`` が評価されます。もし結果が真であったならば、 ``when-body`` の式が続けて評価されます。さもなければ、次の ``catch`` 文が評価されます。
309
310 ``catch-body`` か ``when-body`` の評価が完全に終わった場合、別の ``when`` 文を評価することなく ``finally-body`` の式が評価され、値 ``v`` が返されます。
311
312 ``try`` 文には任意の数の ``catch`` 文を含めることができます。また、 ``finally`` 文はなくても構いません。
313
314 .. index::
315    single: raise()
316 .. _label9.2.8:
317
318 9.2.8 raise
319 ^^^^^^^^^^^^^^^^^^^^^^^^^
320 ``raise`` 関数は例外を送出します。 ``exn`` は任意のオブジェクトです。しかしながら、通常は ``Exception`` オブジェクトを送出します。
321
322 もし例外が捕らえられなかった場合、全体のオブジェクトはエラーメッセージとして詳細に出力されます。しかしながら、もしオブジェクトが ``Exception`` で ``message`` プロパティを含んでいた場合、エラーメッセージは ``message`` のみが出力されます。
323
324 .. index::
325    single: exit()
326 .. _label9.2.9:
327
328 9.2.9 exit
329 ^^^^^^^^^^^^^^^^^^^^^^^^^
330 ::
331
332    exit(code)
333       code : Int
334
335 ``exit`` 関数はomakeを異常終了させます。
336
337 ``$(exit <code>)``
338
339 ``exit`` 関数は終了コードである整数を引数に指定します。0でない値は異常終了を表します。
340
341 .. index::
342    single: defined()
343 .. _label9.2.10:
344
345 9.2.10 defined
346 ^^^^^^^^^^^^^^^^^^^^^^^^^
347 ::
348
349    $(defined sequence) : String
350       sequence : Sequence
351
352 ``defined`` 関数はシーケンス中のすべての変数が現在定義されているか試します。例えば、以下のコードでは変数 ``X`` が既に定義されていないかどうかを定義しています。 ::
353
354     if $(not $(defined X))
355        X = a b c
356        export
357
358 これは修飾された変数にも用いることができます。 ::
359
360     $(defined X.a.b)
361     $(defined public.X)
362
363 .. index::
364    single: defined-env()
365 .. _label9.2.11:
366
367 9.2.11 defined-env
368 ^^^^^^^^^^^^^^^^^^^^^^^^^
369 ::
370
371    $(defined-env sequence) : String
372       sequence : String
373
374 ``defined-env`` 関数は処理している環境で、指定された変数が定義されているかどうか試します。
375
376 例えば、以下のコードでは、環境変数 ``DEBUG`` が定義されている場合は ``-g`` コンパイルオプションを追加します。 ::
377
378   if $(defined-env DEBUG)
379       CFLAGS += -g
380       export
381
382 .. index::
383    single: getenv()
384 .. _label9.2.12:
385
386 9.2.12 getenv
387 ^^^^^^^^^^^^^^^^^^^^^^^^^
388 ::
389
390    $(getenv name) : String
391    $(getenv name, default) : String
392
393 ``getenv`` 関数は現在処理している環境での変数の値を取得します。この関数は一つか二つの引数を指定する必要があります。
394
395 一つの引数を指定した場合、もし環境中で変数が定義されていなかったならば例外を送出します。二つの引数を指定した場合、もし定義されていなかったならば二番目の引数が返されます。
396
397 例えば、以下のコードでは、もし環境変数 ``PATH`` が定義されていた場合は、その値を空白で分割したリストとして ``X`` を定義します。さもなければ ``/bin /usr/bin`` が代わりに使われます。 ::
398
399     X = $(split $(PATHSEP), $(getenv PATH, /bin:/usr/bin))
400
401 あなたは以下のような形でも定義することができます。 ::
402
403      getenv(NAME)
404          default
405
406 .. index::
407    single: setenv()
408 .. _label9.2.13:
409
410 9.2.13 setenv
411 ^^^^^^^^^^^^^^^^^^^^^^^^^
412 ::
413
414    setenv(name, value)
415       name : String
416       value : String
417
418 ``setenv`` 関数は現在処理している環境での変数を定義します。環境変数は通常の変数のようにスコープされます。
419
420 .. index::
421    single: unsetenv()
422 .. _label9.2.14:
423
424 9.2.14 unsetenv
425 ^^^^^^^^^^^^^^^^^^^^^^^^^
426 ::
427
428    unsetenv(names)
429       names : String Array
430
431 ``unsetenv`` 関数は現在処理している環境からいくつかの変数を削除します。環境変数は通常の変数のようにスコープされます。
432
433 .. index::
434    single: get-registry()
435 .. _label9.2.15:
436
437 9.2.15 get-registry
438 ^^^^^^^^^^^^^^^^^^^^^^^^^
439 ::
440
441    get-registry(hkey, key, field) : String
442    get-registry(hkey, key, field, default) : String
443        hkey : String
444        key : String
445        field : String
446
447 ``get-registry`` 関数はWin32上のシステムレジストリから文字列を取得します。他のアーキテクチャ上では、レジストリの値は返されません。
448
449 ``hive`` (私はこの呼び方が正しいと思っています)では、使用するレジストリの区分を指定します。これは以下の値である必要があります。(訳注: よく意味がわかりませんがhkeyとfiveをもじったもの?)
450
451 * HKEY_CLASSES_ROOT 
452 * HKEY_CURRENT_CONFIG 
453 * HKEY_CURRENT_USER 
454 * HKEY_LOCAL_MACHINE 
455 * HKEY_USERS 
456
457 もしこれらの意味について知りたい場合はマイクロソフトのドキュメントを参照してください。
458
459 ``key`` はレジストリから取得したいフィールドを指定します。これは ``A\B\C`` のような形である必要があります(通常のスラッシュを用いた場合はバックスラッシュに変換されます)。 ``field`` は ``key`` のサブフィールドを指定します。
460
461 4つの引数を取る場合、 ``default`` の値が失敗したときに返されます。あなたはこれを別の形で用いることもできます。 ::
462
463     get-registry(hkey, key, field)
464        default
465
466 .. index::
467    single: getvar()
468 .. _label9.2.16:
469
470 9.2.16 getvar
471 ^^^^^^^^^^^^^^^^^^^^^^^^^
472 ::
473
474    $(getvar name) : String
475
476 ``getvar`` 関数は変数の値を取得します。
477
478 もし変数が定義されていない場合は例外が送出されます。
479
480 例えば、以下のコードでは ``X`` を文字列 ``abc`` で定義します。 ::
481
482     NAME = foo
483     foo_1 = abc
484     X = $(getvar $(NAME)_1)
485
486 これは修飾された変数にも使うことができます。 ::
487
488     $(getvar X.a.b)
489
490 .. index::
491    single: setvar()
492 .. _label9.2.17:
493
494 9.2.17 setvar
495 ^^^^^^^^^^^^^^^^^^^^^^^^^
496 ::
497
498    setvar(name, value)
499       name : String
500       value : String
501
502 ``setvar`` 関数は新しい変数を定義します。例えば、以下のコードでは ``X`` は文字列 ``abc`` で定義されます。 ::
503
504    NAME = X
505    setvar($(NAME), abc)
506
507 これは修飾された変数にも使うことができます。 ::
508
509     setvar(public.X, abc)
510
511 9.3 配列とシーケンス
512 ----------------------------------
513
514 .. index::
515    single: array()
516 .. _label9.3.1:
517
518 9.3.1 array
519 ^^^^^^^^^^^^^^^^^^^^^^^^^
520 ::
521
522     $(array elements) : Array
523        elements : Sequence
524
525 ``array`` 関数はシーケンスから配列を生成します。もし ``<arg>`` が文字列だった場合、配列の成分はホワイトスペースによって区切られた文字列となります。また、クオートによっても区切られます。
526
527 加えて、配列の変数は以下のように宣言することができます。 ::
528
529     A[] =
530        <val1>
531        ...
532        <valn>
533
534 この場合、配列の成分は ``<val1>`` , ... , ``<valn>`` であり、ホワイトスペースは文字通りに取り扱われます。
535
536 .. index::
537    single: split()
538 .. _label9.3.2:
539
540 9.3.2 split
541 ^^^^^^^^^^^^^^^^^^^^^^^^^
542 ::
543
544    $(split sep, elements) : Array
545       sep : String
546       elements : Sequence
547
548 ``split`` 関数は二つの引数を必要とし、一つめには文字列のデリミタ、二つめには区切りたい文字列を指定します。結果は ``elements`` シーケンスをセパレータによって区切った配列が返されます。
549
550 例えば以下のコードでは、変数 ``X`` は配列 ``/bin /usr/bin /usr/local/bin`` に定義されます。 ::
551
552     PATH = /bin:/usr/bin:/usr/local/bin
553     X = $(split :, $(PATH))
554
555 ``sep`` は除外することもできます。この場合 ``split`` はホワイトスペースで区切ります。クオーテーションは区切りません。
556
557 .. index::
558    single: concat()
559 .. _label9.3.3:
560
561 9.3.3 concat
562 ^^^^^^^^^^^^^^^^^^^^^^^^^
563 ::
564
565    $(concat sep, elements) : String
566       sep : String
567       elements : Sequence
568
569 ``concat`` 関数は二つの引数を必要とし、一つめには文字列のセパレータ、二つめにはシーケンスを指定します。結果は隣接した成分の間にセパレータを配置した、結合された文字列が返されます。
570
571 例えば以下のコードでは、変数 ``X`` は文字列 ``foo_x_bar_x_baz`` に定義されます。 ::
572
573     X = foo  bar     baz
574     Y = $(concat _x_, $(X))
575
576 .. index::
577    single: length()
578 .. _label9.3.4:
579
580 9.3.4 length
581 ^^^^^^^^^^^^^^^^^^^^^^^^^
582 ::
583
584    $(length sequence) : Int
585       sequence : Sequence
586
587 ``length`` 関数は引数の成分の数を返します。
588
589 例えば、式 ``$(length a b "c d")`` は3と評価されます。
590
591 .. index::
592    single: nth()
593 .. _label9.3.5:
594
595 9.3.5 nth
596 ^^^^^^^^^^^^^^^^^^^^^^^^^
597 ::
598
599    $(nth i, sequence) : value
600       i : Int
601       sequence : Sequence
602    raises RuntimeException
603
604 ``nth`` 関数は引数のi番目の成分を返します。配列のインデックスは0から始まります。もしインデックスが存在しない成分を指定していた場合、例外が送出されます。
605
606 例えば、式 ``$(nth 1, a "b c" d)`` は ``"b c"`` と評価されます。
607
608 .. index::
609    single: replace-nth()
610 .. _label9.3.6:
611
612 9.3.6 replace-nth
613 ^^^^^^^^^^^^^^^^^^^^^^^^^
614 ::
615
616    $(replace-nth i, sequence, x) : value
617       i : Int
618       sequence : Sequence
619       x : value
620    raises RuntimeException
621
622 ``replace-nth`` 関数はi番目の成分を新しい値 ``x`` に置き換えます。インデックスは0から始まります。もしインデックスが存在しない成分を指定していた場合、例外が送出されます。
623
624 例えば、式 ``$(replace-nth 1, a "b c" d, x)`` は ``a x d`` と評価されます。
625
626 .. index::
627    single: nth-hd()
628 .. _label9.3.7:
629
630 9.3.7 nth-hd
631 ^^^^^^^^^^^^^^^^^^^^^^^^^
632 ::
633
634    $(nth-hd i, sequence) : value
635       i : Int
636       sequence : Sequence
637    raises RuntimeException
638
639 ``nth-hd`` 関数は最初から ``i`` 個までの成分をもった配列を返します。もしシーケンスが ``i`` 個より少ない場合は例外が送出されます。
640
641 例えば、式 ``$(nth-hd 2, a "b c" d)`` は ``a "b c"`` と評価されます。
642
643 .. index::
644    single: nth-tl()
645 .. _label9.3.8:
646
647 9.3.8 nth-tl
648 ^^^^^^^^^^^^^^^^^^^^^^^^^
649 ::
650
651    $(nth-tl i, sequence) : value
652       i : Int
653       sequence : Sequence
654    raises RuntimeException
655
656 ``nth-tl`` 関数は最初から ``i`` 個までの成分を除いた、残りの配列を返します。もしシーケンスが ``i`` 個より少ない場合には例外が送出されます。
657
658 例えば、式 ``$(nth-tl 1, a "b c" d)`` は ``"b c" d`` と評価されます。
659
660 .. index::
661    single: subrange()
662 .. _label9.3.9:
663
664 9.3.9 subrange
665 ^^^^^^^^^^^^^^^^^^^^^^^^^
666 ::
667
668    $(subrange off, len, sequent) : value
669       off : Int
670       len : Int
671       sequence : Sequence
672    raises RuntimeException
673
674 ``subrange`` 関数はシーケンスの一部分を返します。インデックスは0から始まります。もし指定された範囲に成分が存在しない場合には例外が送出されます。
675
676 例えば、式 ``$(subrange 1, 2, a "b c" d e)`` は ``"b c" d`` と評価されます。
677
678 .. index::
679    single: rev()
680 .. _label9.3.10:
681
682 9.3.10 rev
683 ^^^^^^^^^^^^^^^^^^^^^^^^^
684 ::
685
686     $(rev sequence) : Sequence
687        sequence : Sequence
688
689 ``rev`` 関数は指定された配列の順番を逆にした配列を返します。例えば、式 ``$(rev a "b c" d)`` は ``d "b c" a`` と評価されます。
690
691 .. index::
692    single: join()
693 .. _label9.3.11:
694
695 9.3.11 join
696 ^^^^^^^^^^^^^^^^^^^^^^^^^
697 ::
698
699    $(join sequence1, sequence2) : Sequence
700       sequence1 : Sequence
701       sequence2 : Sequence
702
703 ``join`` 関数は二つのシーケンスの成分を互いに結合させます。例えば、 ``$(join a b c, .c .cpp .h)`` は ``a.c b.cpp c.h`` と評価されます。もし二つの入力シーケンスが異なる長さであった場合は、長いシーケンスの残りの成分は、出力先の配列の終わりに修正されない状態でコピーされます。
704
705 .. index::
706    single: string()
707 .. _label9.3.12:
708
709 9.3.12 string
710 ^^^^^^^^^^^^^^^^^^^^^^^^^
711 ::
712
713    $(string sequence) : String
714       sequence : Sequence
715
716 ``string`` 関数はシーケンスを一つの文字列にまとめます。これは ``concat`` 関数と似ていますが、この成分はホワイトスペースによって分割されています。結果は一つのユニットとして扱われます。ホワイトスペースは重要です。
717
718 .. index::
719    single: string-length()
720 .. _label9.3.13:
721
722 9.3.13 string-length
723 ^^^^^^^^^^^^^^^^^^^^^^^^^
724 ::
725
726    $(string-length sequence) : Int
727       sequence : Sequence
728
729 ``string-length`` 関数は引数の文字列の長さを返します。もし引数がシーケンスであった場合、まとめられた状態で評価されます。よって、 ``$(string-length sequence)`` は ``$(string-length $(string sequence))`` と等価です。
730
731 .. index::
732    single: string-escaped()
733    single: ocaml-escaped()
734    single: html-escaped()
735    single: html-pre-escaped()
736    single: c-escaped()
737    single: id-escaped()
738 .. _label9.3.14:
739
740 9.3.14 string-escaped, ocaml-escaped, html-escaped, html-pre-escaped, c-escaped, id-escaped
741 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
742 ::
743
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
750       sequence : Array
751
752 ``string-escaped`` 関数は引数の各々の成分を文字列に変換し、もしその成分がOMakeの特殊文字を含んでいた場合は、その文字をエスケープした状態で返します。特殊文字は ``:()\,$'"#`` とホワイトスペースを含みます。この関数はスキャナルール中で、 ``stdout`` に出力する前にファイル名をエスケープするために使われます。
753
754 ``ocaml-escaped`` 関数はOCamlの特殊文字をエスケープした状態で返します。
755
756 ``c-escaped`` 関数はCの文字定数に使われるような形の文字列に変換します。
757
758 ``id-escaped`` 関数はOMakeで使われるような識別子に変換します。
759
760 ``html-escaped`` 関数はHTMLで文字通りに読み込まれるような形の文字列に変換します。 ``html-pre-escaped`` 関数と似ていますが、この関数では改行は ``<br>`` に変換されません。 ::
761
762     println($(string $(string-escaped $"a b" $"y:z")))
763     a\ b y\:z
764
765 .. index::
766    single: decode-uri()
767    single: encode-uri()
768 .. _label9.3.15:
769
770 9.3.15 decode-uri, encode-uri
771 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
772 ::
773
774     $(decode-uri sequence) : sequence
775         sequence : Sequence
776
777 これら二つの関数はURIのエンコーディングに用いられ、特殊文字を16進数の文字に置き換えます。 ::
778
779     osh> s = $(encode-uri $'a b~c')
780     "a+b%7ec"
781     osh> decode-uri($s)
782     "a b~c"
783
784 .. index::
785    single: quote()
786 .. _label9.3.16:
787
788 9.3.16 quote
789 ^^^^^^^^^^^^^^^^^^^^^^^^^
790 ::
791
792    $(quote sequence) : String
793       sequence : Sequence
794
795 ``quote`` 関数はシーケンスを一つの文字列にまとめ、さらに文字列にクオートを付与します。内部のクオーテーションはエスケープされます。
796
797 例えば、式 ``$(quote a "b c" d)`` は ``"a \"b c\" d"`` に、 ``$(quote abc)`` は ``"abc"`` に評価されます。
798
799 .. index::
800    single: quote-argv()
801 .. _label9.3.17:
802
803 9.3.17 quote-argv
804 ^^^^^^^^^^^^^^^^^^^^^^^^^
805 ::
806
807    $(quote-argv sequence) : String
808       sequence : Sequence
809
810 ``quote-argv`` 関数はシーケンスを一つの文字列にまとめ、さらに文字列にクオートを付与します。The quotation is formed so that a command-line parse can separate the string back into its components. 
811
812 .. index::
813    single: html-string()
814 .. _label9.3.18:
815
816 9.3.18 html-string
817 ^^^^^^^^^^^^^^^^^^^^^^^^^
818 ::
819
820    $(html-string sequence) : String
821       sequence : Sequence
822
823 ``html-string`` 関数はシーケンスを一つの文字列にまとめ、さらに特殊なHTML文字にエスケープします。 ``concat`` 関数と似ていますが、この関数はホワイトスペースで分割を行います。結果は一つの文字列として返されます。
824
825 .. index::
826    single: addsuffix()
827 .. _label9.3.19:
828
829 9.3.19 addsuffix
830 ^^^^^^^^^^^^^^^^^^^^^^^^^
831 ::
832
833    $(addsuffix suffix, sequence) : Array
834       suffix : String
835       sequence : Sequence
836
837 ``addsuffix`` 関数はシーケンスの各々の成分に接尾辞を付与します。返される配列の長さは、指定されたシーケンスの配列の長さと全く同じです。
838
839 例えば、 ``$(addsuffix .c, a b "c d")`` は ``a.c b.c "c d".c`` と評価されます。
840
841 .. index::
842    single: mapsuffix()
843 .. _label9.3.20:
844
845 9.3.20 mapsuffix
846 ^^^^^^^^^^^^^^^^^^^^^^^^^
847 ::
848
849    $(mapsuffix suffix, sequence) : Array
850       suffix : value
851       sequence : Sequence
852
853 ``mapsuffix`` 関数はシーケンスの各々の成分に接尾辞を付与します。これは ``addsuffix`` 関数と似ていますが、この関数は文字列をくっ付ける代わりに新しく成分を追加します。よって、返される配列の長さは、指定されたシーケンスの配列の長さの2倍です。
854
855 例えば、 ``$(mapsuffix .c, a b "c d")`` は ``a .c b .c "c d" .c`` と評価されます。
856
857 .. index::
858    single: addsuffixes()
859 .. _label9.3.21:
860
861 9.3.21 addsuffixes
862 ^^^^^^^^^^^^^^^^^^^^^^^^^
863 ::
864
865    $(addsuffixes suffixes, sequence) : Array
866       suffixes : Sequence
867       sequence : Sequence
868
869 ``addsuffixes`` 関数は最初の引数に指定されたすべての接尾辞をシーケンスの各々の成分に付与します。もし ``suffixes`` が ``n`` 個の成分を、 ``sequence`` が ``m`` 個の成分を持っていた場合、結果は ``n * m`` 個の成分を持ったシーケンスが返されます。
870
871 例えば、 ``$(addsuffixes .c .o, a b c)`` は ``a.c a.o b.c b.o c.c c.o`` と評価されます。
872
873 .. index::
874    single: removeprefix()
875 .. _label9.3.22:
876
877 9.3.22 removeprefix
878 ^^^^^^^^^^^^^^^^^^^^^^^^^
879 ::
880
881    $(removeprefix prefix, sequence) : Array
882       prefix : String
883       sequence : Array
884
885 ``removeprefix`` 関数はシーケンスの各々の成分から接頭辞を取り除きます。
886
887 .. index::
888    single: removesuffix()
889 .. _label9.3.23:
890
891 9.3.23 removesuffix
892 ^^^^^^^^^^^^^^^^^^^^^^^^^
893 ::
894
895    $(removesuffix sequence) : Array
896       sequence : String
897
898 ``removesuffix`` 関数はシーケンスの各々の成分から接尾辞を取り除きます。
899
900 例えば、 ``$(removesuffix a.c b.foo "c d")`` の結果は ``a b "c d"`` となります。
901
902 .. index::
903    single: replacesuffixes()
904 .. _label9.3.24:
905
906 9.3.24 replacesuffixes
907 ^^^^^^^^^^^^^^^^^^^^^^^^^
908 ::
909
910    $(replacesuffixes old-suffixes, new-suffixes, sequence) : Array
911       old-suffixes : Sequence
912       new-suffixes : Sequence
913       sequence : Sequence
914
915 ``replacesuffixes`` 関数はシーケンスの各々の成分の接尾辞を置き換えます。 ``old-suffixes`` と ``new-suffixes`` シーケンスは同じ長さである必要があります。
916
917 例えば、 ``$(replacesuffixes .h .c, .o .o, a.c b.h c.z)`` の結果は ``a.o b.o c.z`` となります。
918
919 .. index::
920    single: addprefix()
921 .. _label9.3.25:
922
923 9.3.25 addprefix
924 ^^^^^^^^^^^^^^^^^^^^^^^^^
925 ::
926
927    $(addprefix prefix, sequence) : Array
928       prefix : String
929       sequence : Sequence
930
931 ``addprefix`` 関数はシーケンスの各々の成分に接頭辞を付与します。返される配列の長さは、指定されたシーケンスの配列の長さと全く同じです。
932
933 例えば、 ``$(addprefix foo/, a b "c d")`` は ``foo/a foo/b foo/"c d"`` と評価されます。
934
935 .. index::
936    single: mapprefix()
937 .. _label9.3.26:
938
939 9.3.26 mapprefix
940 ^^^^^^^^^^^^^^^^^^^^^^^^^
941 ::
942
943    $(mapprefix prefix, sequence) : Array
944       prefix : String
945       sequence : Sequence
946
947 ``mapprefix`` 関数はシーケンスの各々の成分に接頭辞を付与します。これは ``addprefix`` 関数と似ていますが、この関数は文字列をくっ付ける代わりに新しく成分を追加します。よって、返される配列の長さは、指定されたシーケンスの配列の長さの2倍です。
948
949 例えば、 ``$(mapprefix foo, a b "c d")`` の結果は ``foo a foo b foo "c d"`` となります。
950
951 .. index::
952    single: add-wrapper()
953 .. _label9.3.27:
954
955 9.3.27 add-wrapper
956 ^^^^^^^^^^^^^^^^^^^^^^^^^
957 ::
958
959    $(add-wrapper prefix, suffix, sequence) : Array
960       prefix : String
961       suffix : String
962       sequence : Sequence
963
964 ``add-wrapper`` 関数はシーケンスの各々の成分に接頭辞と接尾辞の両方を付与します。例えば、 ``$(add-wrapper dir/, .c, a b)`` は ``dir/a.c dir/b.c`` と評価されます。文字列は結合されるため、返される配列の長さは、指定されたシーケンスの長さと全く同じです。
965
966 .. index::
967    single: set()
968 .. _label9.3.28:
969
970 9.3.28 set
971 ^^^^^^^^^^^^^^^^^^^^^^^^^
972 ::
973
974    $(set sequence) : Array
975       sequence : Sequence
976
977 ``set`` 関数は文字列の集合をソートします。さらに、重複した成分は除去します。
978
979 例えば、 ``$(set z y z "m n" w a)`` の結果は ``"m n" a w y z`` となります。
980
981 .. index::
982    single: mem()
983 .. _label9.3.29:
984
985 9.3.29 mem
986 ^^^^^^^^^^^^^^^^^^^^^^^^^
987 ::
988
989    $(mem elem, sequence) : Boolean
990       elem : String
991       sequence : Sequence
992
993 ``mem`` 関数はシーケンス中に指定した成分が含まれているかどうか調べます。
994
995 例えば、 ``$(mem "m n", y z "m n" w a)`` は ``true`` と評価され、一方で ``$(mem m n, y z "m n" w a)`` は ``false`` と評価されます。
996
997 .. index::
998    single: intersection()
999 .. _label9.3.30:
1000
1001 9.3.30 intersection
1002 ^^^^^^^^^^^^^^^^^^^^^^^^^
1003 ::
1004
1005    $(intersection sequence1, sequence2) : Array
1006       sequence1 : Sequence
1007       sequence2 : Sequence
1008
1009 ``intersection`` 関数は指定された二つの集合の和をとります。返される配列の長さは不定であり、重複があればそれを含みます。もし結果をソートし、さらに重複を除きたい場合は ``set`` 関数を使ってください。
1010
1011 例えば、 ``$(intersection c a b a, b a)`` は ``a b a`` と評価されます。
1012
1013 .. index::
1014    single: intersects()
1015 .. _label9.3.31:
1016
1017 9.3.31 intersects
1018 ^^^^^^^^^^^^^^^^^^^^^^^^^
1019 ::
1020
1021    $(intersects sequence1, sequence2) : Boolean
1022       sequence1 : Sequence
1023       sequence2 : Sequence
1024
1025 ``intersects`` 関数は二つの集合の和が空集合でないかどうか調べます。これは集合の和を計算し、空であるかどうか調べるよりも少しだけ効率的です。
1026
1027 例えば、 ``$(intersects a b c, d c e)`` は ``true`` と評価され、 ``$(intersects a b c a, d e f)`` は ``false`` と評価されます。
1028
1029 .. index::
1030    single: set-diff()
1031 .. _label9.3.32:
1032
1033 9.3.32 set-diff
1034 ^^^^^^^^^^^^^^^^^^^^^^^^^
1035 ::
1036
1037    $(set-diff sequence1, sequence2) : Array
1038       sequence1 : Sequence
1039       sequence2 : Sequence
1040
1041 ``set-diff`` 関数は二つの集合の差異を計算します。結果は ``sequence1`` には含まれるが ``sequence2`` には含まれていない成分からなる配列です。返される配列の長さは不定であり、重複があればそれを含みます。もし結果をソートし、さらに重複を除きたい場合は ``set`` 関数を使ってください。
1042 (訳注: この関数は集合論における ``f(A,B) = A - B`` と等価です。)
1043
1044 例えば、 ``$(set-diff c a b a e, b a)`` は ``c e`` と評価されます。
1045
1046 .. index::
1047    single: filter()
1048 .. _label9.3.33:
1049
1050 9.3.33 filter
1051 ^^^^^^^^^^^^^^^^^^^^^^^^^
1052 ::
1053
1054    $(set-diff sequence1, sequence2) : Array
1055       sequence1 : Sequence
1056       sequence2 : Sequence
1057
1058 ``filter`` 関数はシーケンスから特定の成分を抜き出します。 ``patterns`` にはパターンを定義した、空でないシーケンスを指定します。また、パターンにはワイルドカード ``%`` を含めることができます。
1059
1060 例えば、 ``$(filter %.h %.o, a.c x.o b.h y.o "hello world".c)`` は ``x.o b.h y.o`` と評価されます。
1061
1062 .. index::
1063    single: filter-out()
1064 .. _label9.3.34:
1065
1066 9.3.34 filter-out
1067 ^^^^^^^^^^^^^^^^^^^^^^^^^
1068 ::
1069
1070    $(filter-out patterns, sequence) : Array
1071       patterns : Sequence
1072       sequence : Sequence
1073
1074 ``filter-out`` 関数はシーケンスから特定の成分を除去します。 ``patterns`` にはパターンを定義した、空でないシーケンスを指定します。また、パターンにはワイルドカード ``%`` を含めることができます。
1075
1076 例えば、 ``$(filter-out %.c %.h, a.c x.o b.h y.o "hello world".c)`` は ``x.o y.o`` と評価されます。
1077
1078 .. index::
1079    single: capitalize()
1080 .. _label9.3.35:
1081
1082 9.3.35 capitalize
1083 ^^^^^^^^^^^^^^^^^^^^^^^^^
1084 ::
1085
1086    $(capitalize sequence) : Array
1087       sequence : Sequence
1088
1089 ``capitalize`` 関数はシーケンスの各々の成分の単語を大文字化します。例えば、 ``$(capitalize through the looking Glass)`` は ``Through The Looking Glass`` と評価されます。
1090
1091 .. index::
1092    single: uncapitalize()
1093 .. _label9.3.36:
1094
1095 9.3.36 uncapitalize
1096 ^^^^^^^^^^^^^^^^^^^^^^^^^
1097 ::
1098
1099    $(uncapitalize sequence) : Array
1100       sequence : Sequence
1101
1102 ``uncapitalize`` 関数は引数に指定された各々の単語を小文字化します。
1103
1104 例えば、 ``$(uncapitalize through the looking Glass)`` は ``through the looking glass`` と評価されます。
1105
1106 .. index::
1107    single: uppercase()
1108 .. _label9.3.37:
1109
1110 9.3.37 uppercase
1111 ^^^^^^^^^^^^^^^^^^^^^^^^^
1112 ::
1113
1114    $(uppercase sequence) : Array
1115       sequence : Sequence
1116
1117 ``uppercase`` 関数はシーケンス中の文字すべてを大文字化します。例えば、 ``$(uppercase through the looking Glass)`` は ``THROUGH THE LOOKING GLASS`` と評価されます。
1118
1119 .. index::
1120    single: lowercase()
1121 .. _label9.3.38:
1122
1123 9.3.38 lowercase
1124 ^^^^^^^^^^^^^^^^^^^^^^^^^
1125 ::
1126
1127    $(lowercase sequence) : Array
1128       sequence : Sequence
1129
1130 ``lowercase`` 関数はシーケンス中の文字すべてを小文字化します。例えば、 ``$(lowercase through tHe looking Glass)`` は ``through the looking glass`` と評価されます。
1131
1132 .. index::
1133    single: system()
1134 .. _label9.3.39:
1135
1136 9.3.39 system
1137 ^^^^^^^^^^^^^^^^^^^^^^^^^
1138 ::
1139
1140    system(s)
1141       s : Sequence
1142
1143 ``system`` 関数はシェル上のコマンドを評価するために用いられます。シェルコマンドを評価するため、omakeは内部でこの関数を使用しています。
1144
1145 例えば、以下のプログラムは式 ``system(ls foo)`` と等価です。 ::
1146
1147    ls foo
1148
1149 .. index::
1150    single: shell()
1151 .. _label9.3.40:
1152
1153 9.3.40 shell
1154 ^^^^^^^^^^^^^^^^^^^^^^^^^
1155 ::
1156
1157    $(shell command) : Array
1158    $(shella command) : Array
1159    $(shell-code command) : Int
1160       command : Sequence
1161
1162 ``shell`` 関数はシェルコマンドを用いてコマンドを評価し、さらに標準出力先に出力された、ホワイトスペースで区切ってある出力結果を返します。
1163
1164 ``shella`` 関数は同様に振る舞いますが、この関数では改行をそのまま出力するのではなく、分割された配列として返します。
1165
1166 ``shell-code`` は結果として終了コードを返します。出力は返されません。
1167
1168 例えば、もしカレントディレクトリがファイル ``OMakeroot`` , ``OMakefile`` , ``hello.c`` を含んでいる場合、 ``$(shell ls)`` はUnixシステム上では ``hello.c OMakefile OMakeroot`` と評価されます。
1169
1170 .. index::
1171    single: export()
1172 .. _label9.3.41:
1173
1174 9.3.41 export
1175 ^^^^^^^^^^^^^^^^^^^^^^^^^
1176 ``export`` 関数は現在の環境中の変数の値を保存します。
1177
1178 例えば、以下のコードは ``1 1 2`` と出力されます。 ::
1179
1180     A = 1
1181     B = 1
1182     C = 1
1183     SAVE_ENV = $(export A B)
1184     A = 2
1185     B = 2
1186     C = 2
1187     export($(SAVE_ENV))
1188     println($A $B $C)
1189
1190 この関数に引数を指定することは、 ``export`` 文を用いて引数を指定するのと全く等価なものとして解釈されます(詳細は ":ref:`label6.3`" を参照してください)。
1191
1192 .. index::
1193    single: while
1194 .. _label9.3.42:
1195
1196 9.3.42 while
1197 ^^^^^^^^^^^^^^^^^^^^^^^^^
1198 ::
1199
1200    while <test>
1201       <body>
1202
1203 あるいは ::
1204
1205     while <test>
1206     case <test1>
1207        <body1>
1208     ...
1209     case <testn>
1210        <bodyn>
1211     default
1212        <bodyd>
1213
1214 ``<test>`` が真である間はずっとループの式が実行されます。最初の形では、 ``<body>`` はすべてのループにおいて実行されます。二番目の形では、もし ``<testI>`` が真であった場合は ``<bodyI>`` が実行されます。もしなにも当てはまらない場合には ``<bodyd>`` が実行されます。もしすべての場合において真でなかったならば、ループは終了します。なお、ループ中の環境は自動的にエクスポートされます。
1215
1216 例えば、 ``i`` を ``0`` から ``9`` まで繰り返します。 ::
1217
1218     i = 0
1219     while $(lt $i, 10)
1220        echo $i
1221        i = $(add $i, 1)
1222
1223 上の例は以下の例と等価です。 ::
1224
1225    i = 0
1226    while true
1227    case $(lt $i, 10)
1228       echo $i
1229       i = $(add $i, 1)
1230
1231 以下の例は似ていますが、いくつかの特殊な場合においてある文字が出力されます。その他は値が出力されます。 ::
1232
1233     i = 0
1234     while $(lt $i, 10)
1235     case $(equal $i, 0)
1236        echo zero
1237     case $(equal $i, 1)
1238        echo one
1239     default
1240        echo $i
1241
1242 ``break`` 関数は ``while`` ループを早期に抜けたい場合に用いられます。
1243
1244 .. index::
1245    single: break
1246 .. _label9.3.43:
1247
1248 9.3.43 break
1249 ^^^^^^^^^^^^^^^^^^^^^^^^^
1250 ::
1251
1252    break
1253
1254 最も近いループから抜け出し、現在の状態を返します。
1255
1256 .. index::
1257    single: random()
1258    single: random-init()
1259 .. _label9.3.44:
1260
1261 9.3.44 random, random-init
1262 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1263 ::
1264
1265     random-init(i)
1266         i : Int
1267     random() : Int
1268
1269 乱数を生成します。値は疑似乱数で、暗号として用いられるほどセキュアではありません。
1270
1271 乱数生成器はシステムの乱数器を用いて初期化します。よって、次にプログラムを走らせたときの乱数の値は前回と異なります。 ``ramdom-init`` 関数は特定の値を用いて乱数生成器を初期化します。
1272
1273 .. _label9.4:
1274
1275 9.4 演算
1276 ----------------------------------
1277
1278 .. index::
1279    single: int()
1280 .. _label9.4.1:
1281
1282 9.4.1 int
1283 ^^^^^^^^^^^^^^^^^^^^^^^^^
1284 ``int`` 関数は整数値を作るために用いられ、 ``Int`` オブジェクトを返します。 ::
1285
1286         $(int 17)
1287
1288 .. index::
1289    single: float()
1290 .. _label9.4.2:
1291
1292 9.4.2 float
1293 ^^^^^^^^^^^^^^^^^^^^^^^^^
1294 ``float`` 関数は浮動小数点値を作るために用いられ、 ``Float`` オブジェクトを返します。 ::
1295
1296         $(float 3.1415926)
1297
1298 .. index::
1299    single: neg()
1300    single: add()
1301    single: sub()
1302    single: mul()
1303    single: div()
1304    single: mod()
1305    single: lnot()
1306    single: land()
1307    single: lor()
1308    single: lxor()
1309    single: lsl()
1310    single: lsr()
1311    single: asr()
1312    single: min()
1313    single: max()
1314 .. _label9.4.3:
1315
1316 9.4.3 基本的な演算
1317 ^^^^^^^^^^^^^^^^^^^^^^^^^
1318 以下の関数は基本的な数学の演算を行います。
1319
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>)`` : 最も大きい成分
1335
1336
1337 .. index::
1338    single: lt()
1339    single: le()
1340    single: eq()
1341    single: ge()
1342    single: gt()
1343    single: ult()
1344    single: ule()
1345    single: uge()
1346    single: ugt()
1347 .. _label9.4.4:
1348
1349 9.4.4 評価
1350 ^^^^^^^^^^^^^^^^^^^^^^^^^
1351 以下の関数は数学的な評価を行います。
1352
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>)`` : ~より多い(符号なし)
1362
1363 (訳注: ここでいう(符号なし)とは符号ビットを考慮しないで評価を行うことを表しています。例えば、int型とunsigned int型では同じビット数に対してそれぞれ表している数値が異なります。(符号なし)の演算子はこのような場合に用いられます。)
1364
1365 .. _label9.5:
1366
1367 9.5 基本的な関数群
1368 ----------------------------------
1369
1370 .. index::
1371    single: fun()
1372 .. _label9.5.1:
1373
1374 9.5.1 fun
1375 ^^^^^^^^^^^^^^^^^^^^^^^^^
1376 ``fun`` 関数は匿名関数を生成します。 ::
1377
1378 $(fun <v1>, ..., <vn>, <body>)
1379
1380 最後の引数は関数の内容を記述します。他の引数はパラメータ名を指定します。
1381
1382 例えば、以下の3つの関数定義は等価です。 ::
1383
1384     F(X, Y) =
1385        return($(addsuffix $(Y), $(X)))
1386
1387     F = $(fun X, Y, $(addsuffix $(Y), $(X)))
1388
1389     F =
1390        fun(X, Y)
1391           value $(addsuffix $(Y), $(X))
1392
1393 .. index::
1394    single: apply()
1395 .. _label9.5.2:
1396
1397 9.5.2 apply
1398 ^^^^^^^^^^^^^^^^^^^^^^^^^
1399 ``apply`` 関数は関数に値を適用します。 ::
1400
1401         $(apply <fun>, <args>)
1402
1403 以下の関数定義を行った場合について考えてみましょう。 ::
1404
1405     F(X, Y) =
1406        return($(addsuffix $(Y), $(X)))
1407
1408 以下の2つの式は等価です。 ::
1409
1410     X = F(a b c, .c)
1411     X = $(apply $(F), a b c, .c)
1412
1413 .. index::
1414    single: applya()
1415 .. _label9.5.3:
1416
1417 9.5.3 applya
1418 ^^^^^^^^^^^^^^^^^^^^^^^^^
1419 ``applya`` 関数は引数の配列を関数に適用します。 ::
1420
1421         $(applya <fun>, <args>)
1422
1423 例えば、以下のプログラムでは ``Z`` の値は ``file.c`` となります。 ::
1424
1425     F(X, Y) =
1426        return($(addsuffix $(Y), $(X)))
1427     args[] =
1428        file
1429        .c
1430     Z = $(applya $(F), $(args))
1431
1432 .. index::
1433    single: create-map()
1434    single: create-lazy-map()
1435 .. _label9.5.4:
1436
1437 9.5.4 create-map, create-lazy-map
1438 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1439 ``create-map`` 関数は簡単に ``Map`` オブジェクトを作る関数です。 ``create-map`` 関数はキー/値のペアを引数によって指定するので、引数の数は等しくなければなりません。例えば、以下の2つの式は等価です。 ::
1440
1441     X = $(create-map name1, xxx, name2, yyy)
1442
1443     X. =
1444         extends $(Map)
1445         $|name1| = xxx
1446         $|name2| = yyy
1447
1448 ``create-lazy-map`` 関数は ``create-map`` と似ていますが、この関数は値が遅延評価されます。例えば、以下の2つの式は等価です。 ::
1449
1450     Y = $(create-lazy-map name1, $(xxx), name2, $(yyy))
1451
1452     Y. =
1453         extends $(Map)
1454         $|name1| = $`(xxx)
1455         $|name2| = $`(yyy)
1456
1457 ``create-lazy-map`` 関数はルールを生成する際に用いられます。
1458
1459 .. _label9.6:
1460
1461 9.6 イテレーションとマッピング
1462 ----------------------------------
1463
1464 .. index::
1465    single: foreach()
1466 .. _label9.6.1:
1467
1468 9.6.1 foreach
1469 ^^^^^^^^^^^^^^^^^^^^^^^^^
1470 ``foreach`` 関数はシーケンスすべての成分にわたって関数を適用します。 ::
1471
1472     $(foreach <fun>, <args>)
1473
1474     foreach(<var>, <args>)
1475        <body>
1476
1477 例えば、以下のプログラムでは変数 ``X`` は配列 ``a.c b.c c.c`` と定義されます。 ::
1478
1479     X =
1480        foreach(x, a b c)
1481           value $(x).c
1482
1483     # 等価な式
1484     X = $(foreach $(fun x, $(x).c), abc)
1485
1486 これらの表現を省略することもできます。
1487
1488 ``export`` 文は ``foreach`` の内容に使うこともできます。例えば、以下の式の ``X`` は最終的に ``a.c b.c c.c`` となります。 ::
1489
1490     X =
1491     foreach(x, a b c)
1492        X += $(x).c
1493        export
1494
1495 ``break`` 関数はこのようなループを早期に抜けたい場合に用いられます。
1496
1497 .. _label9.7:
1498
1499 9.7 ブーリアン関数群
1500 ----------------------------------
1501
1502 .. index::
1503    single: sequence-forall()
1504 .. _label9.7.1:
1505
1506 9.7.1 sequence-forall
1507 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1508 ``forall`` 関数は ``<body>`` がシーケンスのすべての成分に当てはまっているかどうか調べます。 ::
1509
1510     $(sequence-forall <fun>, <args>)
1511
1512     sequence-forall(<var> => ..., <args>)
1513        <body>
1514
1515 .. index::
1516    single: sequence-forall()
1517 .. _label9.7.2:
1518
1519 9.7.2 sequence-exists
1520 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1521 ``exists`` 関数は ``<body>`` がシーケンスのいくつかの成分に当てはまっているかどうか調べます。 ::
1522
1523     $(sequence-exists <fun>, <args>)
1524
1525     sequence-exists(<var> => ..., <args>)
1526        <body>
1527
1528 .. index::
1529    single: sequence-sort()
1530 .. _label9.7.3:
1531
1532 9.7.3 sequence-sort
1533 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1534 ``sort`` 関数は配列の成分を与えられた評価関数を元にソートします。評価関数は二つの引数(x, y)を取ります。もしx < yであった場合、評価関数は負の値を返す必要があります。同様に、x > yの場合は正の値、x = yの場合は0を返します。 ::
1535
1536     $(sequence-sort <fun>, <args>)
1537
1538     sort(<var>, <var> => ..., <args>)
1539        <body>
1540
1541 .. index::
1542    single: compare()
1543 .. _label9.7.4:
1544
1545 9.7.4 compare
1546 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1547 ``compare`` 関数は二つの値(x, y)を比較します。もしx < yであった場合、この関数は負の値を返します。同様に、x > yの場合は正の値、x = yの場合は0を返します。 ::
1548
1549     $(compare x, y) : Int