12. 標準的なオブジェクト群

ここでの『広く使われている』は、すべてのプログラムで使われているオブジェクトを意味しています。以下のオブジェクトが定義されています。

12.1 広く使われているオブジェクト

12.1.1 Object

親オブジェクト : 無し

Object オブジェクトはルートとなるオブジェクトです。すべてのクラスは Object のサブクラスです。

以下のフィールドやメソッドを提供します。

  • $(o.object-length) : オブジェクトのメソッドとフィールドの総数

  • $(o.object-mem <var>) : <var>がオブジェクトのフィールドやメソッドであった場合は true を返します。

  • $(o.object-add <var, <value>) : オブジェクトにフィールドを追加した新しいオブジェクトを返します。

  • $(o.object-find <var>) : オブジェクトのメソッドやフィールドを取得します。これは $(o.<var>) と等価ですが、変数は定数でなくても構いません。

  • $(o.object-map <fun>) : オブジェクト全体に対して関数を適用します。この関数は二つの引数を取り、一つ目はフィールドの名前で、二番目にはフィールドの値を指定します。結果は関数によって返される値が適用された、新しいオブジェクトを返します。

  • $(o.object-foreach) : object-foreachobject-map と等価ですが、別の構文を適用できます。

    o.object-foreach(<var1>, <var2>)
       <body>
    

    例えば、以下の関数はオブジェクト o のすべてのフィールドを表示します。

    PrintObject(o) =
     o.object-foreach(v, x)
        println($(v) = $(x))
    

    export 文は object-foreach の内部に適用できます。以下の関数ではオブジェクトのフィールド名を収集します。

    FieldNames(o) =
       names[] =
       o.object-foreach(v, x)
          names[] += $(v)
          export
       return $(names)
    

12.1.2 Map

親オブジェクト : Object

Map オブジェクトは値から値を返す辞書です。 <key> の値は単純な型のみが使用できます。具体的には、整数型、浮動小数点型、文字列型、ファイル型、辞書型、そして単純な型で構成された配列です。

Mapオブジェクトは以下のメソッドを提供します。

  • $(o.length) : 辞書に格納されているアイテムの総数

  • $(o.mem <key>) : <key> が辞書に定義されている場合は true を返します。

  • $(o.add <key>, <value>) : 辞書にフィールドを追加した、新しい辞書を返します。

  • $(o.find <key>) : 辞書から対象のフィールドを取得します。

  • $(o.keys) : 辞書の中にあるすべてのキーの配列をアルファベット順で取得します。

  • $(o.values) : 辞書の中にあるすべての値の配列を、キーのアルファベット順で取得します。

  • $(o.map <fun>) : 一つ目はフィールドの名前で、二番目にはフィールドの値を指定します。結果は関数によって返される値が適用された、新しいオブジェクトを返します。

  • $(o.foreach) : foreach 文は map と等価ですが、別の構文を適用できます。

    o.foreach(<var1>, <var2>)
       <body>
    

    例えば、以下の関数はオブジェクト o のすべてのフィールドを表示します。

    PrintObject(o) =
       o.foreach(v, x)
          println($(v) = $(x))
    

    export 文は object-foreach の内部に適用できます。以下の関数では辞書のフィールド名を収集します。

    FieldNames(o) =
       names =
       o.foreach(v, x)
          names += $(v)
          export
       return $(names)
    

キーが文字列である場合には単純な記法が用意されています。キー-値のテーブルは $|key| の文を用いて定義することができます(パイプシンボル | の数は、多様性のためにいくらでも使うことができます)。

$|key 1| = value1
$||key1|key2|| = value2    # キーは key1|key2
X = $|key 1|               # Xにフィールドの値 $|key 1| を定義

通常用いる修飾子も適用できます。式 $`|key| はキーの遅延評価として解釈されて、また式 $,|key| は通常の評価を行います。

12.1.3 Number

親オブジェクト : Object

Number オブジェクトは整数や浮動小数点の親オブジェクトです。

12.1.4 Int

親オブジェクト : Number

Int オブジェクトは整数を表現します。

12.1.5 Float

親オブジェクト : Number

Float オブジェクトは浮動小数点を表現します。

12.1.6 Sequence

親オブジェクト : Object

Sequence オブジェクトは一次元的に成分が格納されている、一般的なオブジェクトを表現します。このオブジェクトは以下のメソッドを提供しています。

  • $(s.length) : シーケンスの長さを返します。

  • $(s.map <fun>) : シーケンスのフィールド全体に対して関数を適用します。この関数は一つの引数を取ります。結果は関数によって返される値からなる、新しいシーケンスを返します。

  • $(s.foreach) : foreach 文は map と等価ですが、別の構文を適用できます。

    s.foreach(<var>)
       <body>
    

    例えば、以下の関数ではシーケンスのすべての成分を表示します。

    PrintSequence(s) =
       s.foreach(x)
          println(Elem = $(x))
    

    export 文は foreach の内部に適用できます。以下の関数はシーケンスの0の数を数えます。

    Zeros(s) =
       count = $(int 0)
       s.foreach(v)
          if $(equal $(v), 0)
             count = $(add $(count), 1)
             export
          export
       return $(count)
    
  • $(s.forall <fun>) : シーケンスの各々の成分が、与えられた関数の評価を満足しているかどうか調べます。
  • $(s.exists <fun>) : シーケンスに与えられた関数の評価を満足するような成分があるかどうか調べます。
  • $(s.sort <fun>) : シーケンスをソートします。 <fun> は比較用の関数です。この関数は二つの成分 (x, y) を持つシーケンスを引数に取り、x,yを比較して、もし x < y であったのなら負の値を返し、 x > y であったなら正の値を返し、二つの成分が等価であったなら0を返します。

    osh> items = $(int 0 3 -2)
    osh> items.forall(x => $(gt $x, 0))
    - : bool = false
    osh> items.exists(x => $(gt $x, 0))
    - : bool = true
    osh> items.sort($(compare))
    - : Array = -2 3 0
    

12.1.7 Array

親オブジェクト : Sequence

Array は自由にアクセスできるシーケンスです。このオブジェクトは以下の追加メソッドを提供しています。

  • $(s.nth <i>) : シーケンスの i 番めの成分を返します。
  • $(s.rev <i>) : 逆転させたシーケンスを返します。

12.1.8 String

親オブジェクト : Array

12.1.9 Fun

親オブジェクト : Object

Fun オブジェクトは以下のメソッドを提供しています。

  • $(f.arity) : 関数の場合はアリティ(関数が取る引数の個数)を返します。

12.1.10 Rule

親オブジェクト : Object

Rule オブジェクトはビルドルールを表現します。これは現在なんのメソッドも持っていません。

12.1.11 Target

親オブジェクト : Object

Target オブジェクトは指定したターゲットファイルの情報を収集しているオブジェクトです。

  • target : ターゲットファイル
  • effects : ターゲットがビルドされたときに、副次的に修正されるであろうファイル群
  • scanner_deps : ターゲットがスキャンできるようになる前にビルドしなければならない静的な依存関係
  • static-deps : 静的に定義されている、ターゲットの依存関係
  • build-deps : 静的、あるいはスキャンされた依存関係を含む、ターゲットに対するすべての依存関係
  • build-values : ビルドに関係している、すべての依存関係の値
  • build-commands : ターゲットをビルドするためのコマンド
  • output-file : --output-* オプション( A.2.8 -output-normal 以降を参照)を用いて、出力が適当なファイルに書き込まれるような場合、このフィールドはファイル名を表します。そうでない場合は false を示します。

このオブジェクトは以下のメソッドをサポートしています。

  • find(file) : 与えられたファイルのターゲットオブジェクトを返します。指定したターゲットがプロジェクトの一部でない場合は RuntimeException を送出します。
  • find-optional(file) : 与えられたファイルのターゲットオブジェクトを返します。指定したターゲットがプロジェクトの一部でない場合は false を返します。

ノート

ターゲットの情報は動的に構築されるので、あるノードの Target オブジェクトは異なる箇所で異なった値を含む場合があります。 Target の情報が完全にするためのもっとも簡単な方法は、対象のターゲットファイルに依存しているルール中、もしくは対象のターゲットファイルの依存関係の中で Target オブジェクトを計算することです。

12.1.12 Node

親オブジェクト : Object

Node オブジェクトはファイルやディレクトリの親オブジェクトです。このオブジェクトは以下の操作をサポートしています。

  • $(node.stat) : ファイルの stat オブジェクトを返します。もしファイルがシンボリックリンクであったなら、 stat の情報はリンク先になります。リンク自身ではありません。
  • $(node.lstat) : ファイルか、シンボリックリンクの stat オブジェクトを返します。
  • $(node.unlink) : ファイルを消去します。
  • $(node.rename <file>) : ファイルをリネームします。
  • $(node.link <dst>) : このファイルのハードリンクを <dst> に生成します。
  • $(node.symlink <file>) : このファイルのシンボリックリンクを <dst> に生成します。
  • $(node.chmod <perm>) : このファイルのパーミッションを変更します。
  • $(node.chown <uid>, <gid>) : このファイルの所有者とグループIDを変更します。

12.1.13 File

親オブジェクト : Node

File オブジェクトはファイル名を表現します。

12.1.14 Dir

親オブジェクト : Node

Dir オブジェクトはディレクトリ名を表現します。

12.1.15 Channel

親オブジェクト : Object

Channel オブジェクトは一般的なIOチャネルを表現します。このオブジェクトは以下のメソッドを提供しています。

  • $(o.close) : チャネルを閉じます。
  • $(o.name) : チャネルに関係しているファイル名を返します。

12.1.16 InChannel

親オブジェクト : Channel

InChannel は入力チャネルです。変数 stdin は標準入力チャネルです。

このオブジェクトは以下のメソッドを提供しています。

  • $(InChannel.fopen <file>) : 新しい入力チャネルを開きます。
  • $(InChannel.of-string <string>) : 文字列を入力として、新しい入力チャネルを開きます。
  • $(o.read <number>) : チャネルから、与えられた数だけ文字を読み込みます。
  • $(o.readln) : チャネルから一行を読み込みます。

12.1.17 OutChannel

親オブジェクト : Channel

OutChannel は出力チャネルです。変数 stdoutstderr は標準出力とエラーチャネルです。

このオブジェクトは以下のメソッドを提供しています。

  • $(OutChannel.fopen <file>) : 新しい出力チャネルを開きます。
  • $(OutChannel.string) : 文字列を書き込む、新しい出力チャネルを開きます。
  • $(OutChannel.to-string) : 現在の出力チャネルの文字列を取得します。これは OutChannel.open-string を使って作られた、出力チャネル用のメソッドです。
  • $(OutChannel.append) : ファイルを追加した、新しい出力チャネルを開きます。
  • $(c.flush) : 出力チャネルをクリアします。
  • $(c.print <string>) : チャネルに文字列を出力します。
  • $(c.print <string>) : チャネルに、改行コードを付与した文字列を出力します。

12.1.18 Location

親オブジェクト : Location

Location オブジェクトはファイルの位置を表現します。

12.1.19 Exception

親オブジェクト : Object

Exception オブジェクトは例外の基底となるオブジェクトとして用いられます。このオブジェクトはなんのフィールドやメソッドを持ちません。

12.1.20 RuntimeException

親オブジェクト : Exception

RuntimeException オブジェクトはランタイムシステムからの例外を表現します。このオブジェクトは以下のフィールドを持ちます。

  • position : 例外が送出された位置を表現している文字列
  • message : 例外のメッセージを保持している文字列

12.1.21 UnbuildableException

親オブジェクト : Exception

UnbuildableException オブジェクトはターゲットがビルドできないことを知らせるために用いられます。このオブジェクトは target-exists() のような関数を使った場合に捕えられます。この例外は以下のフィールドを持ちます。

  • target : どのターゲットがビルドできないのかを示します。
  • message : 例外のメッセージを含んでいる文字列

12.1.22 Shell

親オブジェクト : Object

Shell オブジェクトはシェルコマンドとして利用できるビルドイン関数のコレクションを含んでいます。

あなたはこのオブジェクトにメソッドを追加し拡張することで、エイリアスを定義することができます。このクラスの中にあるすべてのメソッドは一つの引数をとる必要があります。引数には引数のリストが含まれた、単純な配列が与えられます。

  • echo

    echo 関数は引数を標準出力チャネルに表示します。

  • jobs

    jobs メソッドは現在実行しているコマンドの状態を表示します。

  • cd

    cd 関数はカレントディレクトリを変更します。カレントディレクトリは現在のスコーピングルールに従うことに注意してください。例えば、以下のプログラムでは foo ディレクトリのファイルをリストしていますが、カレントディレクトリは変更されません。

    section
       echo Listing files in the foo directory...
       cd foo
       ls
    
    echo Listing files in the current directory...
    ls
    
  • bg

    bg メソッドはバックグラウンドにジョブを移します。ジョブが中断(suspended)されている場合、そのジョブは再開されます。

  • fg

    fg メソッドはジョブをフォアグラウンドに持っていきます。ジョブが中断されている場合、そのジョブは再開されます。

  • stop

    stop 関数は実行しているジョブを中断します。

  • wait

    wait 関数は実行しているジョブが終了するまで待機します。この関数は、中断しているジョブを待機することができません。

    ジョブをフォアグラウンドに持っていくことはしません。また、 wait が割り込まれた場合、ジョブはバックグラウンド上で実行し続けます。

  • kill

    kill 関数はジョブにシグナルを送ります。

    kill [signal] <pid...>.
    

    シグナルは数値かシンボリックのどちらでも構いません。シンボリックシグナルは以下のように命名されています。

    ABRT, ALRM, HUP, ILL, KILL, QUIT, SEGV, TERM, USR1, USR2, CHLD, STOP, TSTP, TTIN, TTOU, VTALRM, PROF

  • exit

    exit 関数は現在のセッションを終了します。

  • which , where

    相当する関数のドキュメントを参照してください。

  • rehash

    検索パスをリセットします。

  • ln-or-cp src dst

    srcdst にリンクもしくはコピーします。 dst は上書きされます。通常、 ln-or-cp は初めに出力先のファイルを(存在している場合は)消去します。次にこの関数は入力先のファイルを指し示しているシンボリックリンクを出力先に生成します(パスはできる限り相対パスとして設定されます)。シンボリックリンクが生成できない場合(例. OSやファイルシステムがシンボリックリンクをサポートしていない場合)、この関数はハードリンクを生成しようと試みます。もしこの試みも失敗したのなら、強制的に入力先のファイルを出力先にコピーしようと試みます。

  • history

    現在のコマンドライン履歴を表示します。

  • digest

    与えられたファイルの要約を出力します。

  • Win32 関数群

    Win32ではスクリプトのために使える、多くのプログラム(DOS cmd.exe に含まれている関数を除く)を提供しています。以下の関数はWin32で定義されており、Win32上でしか使えません。他のシステム上では、この関数はすでに存在している他のプログラムに置き換わることになるでしょう。

    • grep

      grep [-q] [-n] pattern files...
      

      grep 関数はomakeの grep 関数を呼び出します。

  • omake内部の標準システムコマンド

    通常、以下のコマンドはomakeが内部に保有している関数を使います: cp , mv , cat , rm , mkdir , chmod , test , find 。もしあなたがどうしてもこれらのコマンドを、システムが標準で使っているコマンドで呼び出したいのなら、 USE_SYSTEM_COMMANDSOMakeroot ファイルの先頭に設定してください。

    • pwd

      pwd
      

      pwd エイリアスはカレントディレクトリの絶対パスを表示します。

    • mkdir

      mkdir [-m <mode>] [-p] files
      

      mkdir 関数はディレクトリを生成します。 -m オプションには生成されるディレクトリのパーミッションを指定します。 -p オプションが指定された場合、存在しない親ディレクトリもまとめて生成します。

    • cp

    • mv

      cp [-f] [-i] [-v] src dst
      cp [-f] [-i] [-v] files dst
      mv [-f] [-i] [-v] src dst
      mv [-f] [-i] [-v] files dst
      

      cp 関数は src ファイルを dst ファイルにコピーします。出力先のファイルが存在している場合は上書きします。一つ以上の入力ファイルが指定された場合、最後のファイルはディレクトリでなければならず、入力ファイルはそのディレクトリの内部にコピーされます。

      • -f

        確認をしないで、強制的にファイルをコピーします。

      • -i

        出力先のファイルを消去する前に確認します。

      • -v

        実際になにが行われているのか表示します。

    • rm

      rm [-f] [-i] [-v] [-r] files
      rmdir [-f] [-i] [-v] [-r] dirs
      

      rm 関数はファイルの集合を消去します。ファイルが存在しなかった場合、もしくはファイルが消去できなかった場合、なんの警告も表示しません。

      オプション:

      • -f

        確認をしないで、強制的にファイルを消去します。

      • -i

        ファイルを消去する前に確認します。

      • -v

        実際になにが行われているのか表示します。

      • -r

        再帰的にディレクトリの内容を消去します。

    • chmod

      chmod [-r] [-v] [-f] mode files
      

      chmod 関数はファイルの集合やディレクトリのパーミッションを変更します。この関数はWin32上ではなにも行いません。 mode には8進数か、シンボリックフォーム [ugoa]*[-=][rwxXstugo]+ を指定します。詳細は chmod のmanを参照してください。

      オプション:

      • -r

        ディレクトリ内のすべてのファイルのパーミッションを再帰的に変更します。

      • -v

        実際になにが行われているのか表示します。

      • -f

        エラーが生じても実行し続けます。

    • cat

      cat files...
      

      cat 関数はファイルの内容をstdoutに出力します。

    • test

      test expression
      [ expression +]+
      [ --help
      [ --version
      

      詳細は “10.7.1 test” を参照してください。

    • find

      find expression
      

      詳細は “10.7.2 find” を参照してください。