1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

制御構文 ― J 言語入門

Last updated at Posted at 2021-07-03

explicit definition 1 では、他の言語と似た制御構文を使うことができます。

control word

制御構文には、if. のように最後に . がついた単語 (word) を使います。これらの単語を control word と呼びます。control word を用いることができるのは、explicit definition の中だけです。他の場所に書くとエラーになります。

   if.
|spelling error
|      if.
|      ^

したがって、制御構文は explicit definition の外では使えません

構文

それぞれの制御構文の構造を以下に示します。TB 等は、ブロック (文の並び) を表しています。ブロックは括弧のような記号ではなく control word で区切られます。

ほとんどが他の言語と似た構造になっているので、さっと目を通すだけでいいです。

if - elseif - else

条件の後には do. を書きます。また、最後は end. で終わります。

if. T do. B end.
if. T do. B else. B1 end.

if. T do. B
elseif. T1 do. B1
elseif. T2 do. B2
else. B3
end.

T の値が 0 のときが false、それ以外は true と見なされます。ただし、値が配列の場合変わった振る舞いをします。

  • 空の配列は true
  • そうでなければ最初のアトムだけを見る

select - case - fcase

switch ではなく select. です。最初の T の後に do.無いことに注意してください。

select. T
case. T1 do. B1
fcase. T2 do. B2
case. T3 do. B3
case. do. B4
end.

マッチした case. のブロックを実行した後は残りの case. は読み飛ばされます。次のブロックにフォールスルーさせるためには、fcase. を使います。(上の例では T2 にマッチした場合 B2B3 が実行されます。)

case. do.全てにマッチするので、デフォルトの処理を書くのに使います。

-: に似た方法で比較されるので、配列も普通に使えます。

while / whilst

whilst.while. と似ていますが、最初の T の評価をスキップします (do-while 相当)。

while. T do. B end.
whilst. T do. B end.

for / for_ijk

for. はリストの各要素について B を実行します (for each 相当)。要素を変数 i で受ける場合は for_i. とします。(このとき一緒に、変数 i_index に要素のインデックスが入ります。) 変数名は何でも構いません。

for. T do. B end.
for_i. T do. B end.

break / continue / return / throw

break.
continue.
return.
throw.

return. の構文は戻り値を伴いません。返される値は最後に実行した文の結果です 2

throw.uncaught throw. エラーを発生させます。エラーの種類を指定することはできません

try - catch - catchd - catcht

try. B
catch. B1
catchd. B2
catcht. B3
end.

catch.catchd. は、何らかのエラーが発生すると実行されます。catchd. は、デバッグ時には無視されます 3catcht.throw. によるエラーの場合のみ実行されます。

throw. 同様にエラーの種類は指定できません。

assert

T が false (0) の場合に assertion failure を発生させます。if. とは異なり、配列は全ての要素がチェックされます。

assert. T

goto_lbl / label_lbl

goto から対応する label にジャンプする機能です。ラベルの名前は for_ と同じように書きますが、変数とラベルは別物なので名前の衝突を気にする必要はありません。

goto_lbl.
label_lbl.

[ 前 : direct definition ] [ 目次 ] [ 次 ]

  1. 今後、特に断りの無い限り explicit definition は direct definition も暗に含むものとします。

  2. つまり return. は explicit definition の末尾に到達するのと同じ効果を持ちます。

  3. catch. するとエラーがリセットされてしまうので、エラーをデバッグしたいときに便利です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?