ADP
Programming Language ADP

Japanese

Freecode

Sourceforge.net

SourceForge.JP

Loading

制御構造関連

プログラムの制御を行う述語です。

counter (ループを作る)、each (リスト・配列からの要素の取得)、exit(終了)、transfer(別プログラムに制御を移す)等があります。


制御構造関連リファレンス

! (カット)


catch (例外のコールバック)

形式
 catch({ :class=> $class, :message => $message , :at => $at, :in => $in})
引数
  • $class: 例外クラス
  • $message: 例外メッセージ
  • $at: 例外発生場所(評価述語)
  • $in: 例外発生場所(評価ホーン節)
完了時の動作
  • 常に成功を返します。catch述語以降の述語は実行されません。バックトラックもしません。
バックトラック時の動作
  • 常に偽を返します。
説明
 例外の受信を行います。

counter (ループを作る)


形式
 counter( $start, $skip, $end, $counter)
引数
  • $start: ループの初期値
  • $skip: SKIP値
  • $end: 終了値
  • $counter: カウンタ値(結果)
完了時の動作
  • 通常時:次の述語を実行に移ります。
  • $start,$skip,$endが矛盾する時:バックトラックします。
バックトラック時の動作
  • カウント時:次の述語を実行に移ります。
  • カウント終了時:バックトラックします。
説明
 ループを構成する述語です。BASICやC言語のfor文に相当します。
$startを初期値として与えられ、ループをする(バックトラックする)毎に$skipが加算され、$endを超えた段階でループが終了(バックトラック)します。
ループ中$counterに現在のカウンター値が入ります。$start,$skip,$endの値により$counterに$endの値が入ることがあります(例 $start:1, $skip:1, $end:10の時、$counterには1から10の値が入ります)。
$start,$skip,$endが矛盾する場合(例 $start:1, $skip:-1, $end:10の時、$startに$skipをいくら足しても$endに到達しない)は、即座にバックトラックします。

※counter述語を使ってループを構成する場合、next述語と組み合わせて使用します。

コード例(lib/counter.p)
,prtn('start')
  ,counter(1, 1, 10, $c)
  ,prtn($c)
  ,next
  ,prtn('end')
;

実行例
D:\sample\lib>adp counter.p
start
1
2
3
4
5
6
7
8
9
10
end


each (リスト・配列からの要素の取得)


形式
 each( $array,...,$item,...)
引数
  • $array: リスト・配列(複数可)
  • $item 取り出された要素(結果、複数可)
完了時の動作
  • リスト・配列内に要素がある場合:次の述語を実行に移ります。
  • リスト・配列内に要素が無い場合:バックトラックします。
バックトラック時の動作
  • リスト・配列内に次の要素がある場合:次の述語を実行に移ります。
  • リスト・配列内に次の要素が無い場合:バックトラックします。
説明
 $arrayに示されたリスト・配列内の要素を一つずつ取り出し$itemに格納します。他の言語に見られるeachと同様の述語です。
複数のリストを同時に指定することにより、同時に1つずつ取り出すことが出来ます(例を参照)。
リスト・配列の要素の数が同一でない場合は、短い方の要素はNILで埋められます。

※each述語を使ってループを構成する場合、next述語と組み合わせて使用します。

コード例1(lib/each1.p)
,each({ 'a', 'b', 'c'}, $item), prtn($item), next;
実行例1
D:\sample\lib>adp each1.p
a
b
c

コード例2(lib/each2.p)
,each({ 1, 2, 3, 4}, { 'A', 'B', 'C'}, $item1, $item2)
  ,prtn($item1,':',$item2)
  ,next;
実行例2
D:\sample\lib>adp each2.p
1:A
2:B
3:C
4:NIL

exit (プログラムの終了)


形式
 exit( $retcode)
引数
  • $retcode: 結果コード
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$retcodeを引数として、Cのライブラリ関数 exit を呼び出し、プログラムを終了させます。

fail (常に失敗する バックトラックの起動)

形式
 fail
引数
    なし
完了時の動作
  • 常にバックトラックします。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。 ※本来はこの状況にはならないはず。
説明
常にバックトラックを発生させます。
これによりループを実装できますが、通常はnext述語を使用します。

last (?述語の評価結果を返す)

述語のポストフィックスの『評価結果をlast述語で返す』を参照ください。

pipe

transfer (別のスクリプトに制御を渡す)


形式
 transfer( $filepath)
引数
  • $filepath: ファイル名
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。

説明
$filepathで指定されたスクリプトに制御を移します。BASICのCHAINステートメント、ASPのtransferメソッドとほぼ同じです。
transfer述語を実行したスクリプトの以降の別のゴール節は実行されません。以下のコードで printn は実行されません(printnは別のゴール節)。
,transfer($filepath);
,printn('transfer was called');

transfer述語を実行したスクリプトの同じゴール節の残りの述語は実行されます。以下のコードで printnは実行されます(,で区切られている為、printnは同じゴール節)。

,transfer($filepath),printn('transfer was called');


コード例(lib/transferl.p)
,printn('transfer1');
,transfer('transfer2.p');
,printn('I am not printed.');

コード例(lib/transfer2.p)
,printn('transfer2');
,transfer('transfer3.p'), printn('I am printed.');

コード例(lib/transfer3.p)
,printn('DONE.');

実行例
D:\sample\lib>adp transfer1.p
transfer1
transfer2
I am printed.
DONE.

eval (文字列のコンパイル実行)


形式
 eval( $code, $stderr, $stdout)
引数
  • $code: ADPコード(入力)
  • $stderr: 標準エラー(結果、省略可)
  • $stdout: 標準出力(結果、省略可)
完了時の動作
  • 指定された環境変数がある場合:次の述語を実行に移ります。
  • 指定された環境変数が無い場合:バックトラックします。
バックトラック時の動作
  • $codeで指定されたコードへバックトラックします。
説明
 $codeで指定されたADPのコードをコンパイル&実行します。標準エラー($stderr)および標準出力($stdout)を変数に受け取ることが出来ます。$stderr,$stdoutは省略することも出来ます。
結果の受け取りを1つだけ指定した場合、$stdoutとみなされます。

evalは非常に強力な為、セキュリティリスクに注意して使用してください。実行できる組み込み述語に制限を加えた、sandbox述語も用意されています。

※Ver0.79で追加になりました。


Powered by ADP.