bs コマンド

目的

妥当なサイズのプログラムのコンパイルと解釈を行います。

構文

bs [ File [ 引数 ]]

説明

bs コマンドは、対話式プログラム開発とデバッグを行うためのコンパイラーおよびインタープリターです。 このコマンドは、プログラム・テストを簡略化するため、正式なデータ宣言とファイル操作を最小限にし、行単位のデバッグを可能にし、トレース機能、ダンプ機能、および実行時エラー・メッセージを提供します。

オプション・パラメーター File には、 ユーザーが作成するプログラム・ステートメントのファイルを指定します。 コンパイラーは、標準入力から読み取る前にこのファイルを読み取ります。 標準入力から入力されたステートメントは、通常は即時に実行されます ( compile および execute ステートメント構文を参照)。 File から読み取られたステートメントは、デフォルトでは、その後の実行に備えてコンパイルされます。

最後の演算子が変数への代入の場合を除いて、即時式ステートメントの結果が表示されます。

追加のコマンド行 引数 は、組み込み関数 arg および nargを使用してプログラムに渡すことができます。

プログラム行は、次の構文のどちらかでなければなりません。

statement
label statement

このインタープリターは、ステートメントのコンパイル時にのみ、ラベル付きステートメントを受け入れます。 ラベル は、直後にコロンが付いた名前です。 ラベルと変数に同じ名前を付けることができます。 行の最後の文字が ¥ (円記号) の場合、そのステートメントは次の物理行に続きます。

ステートメントは、1 つの式で構成されるか、または後ろに 0 以上の式が続く 1 つのキーワードで構成されます。

注: 国際環境で範囲式を使用するときに予測できない結果を避けるために、標準範囲式ではなく文字クラス式を使用してください。

ステートメント構文

項目 説明
break 最も内側の for ループまたは while ループを抜け出します。
clear 記号テーブルをクリアし、コンパイル済みステートメントをメモリーから削除します。 clear は、常にすぐに実行されます。
compile [] 後続のステートメントをコンパイルします (即時実行のデフォルトはオーバーライドされます)。 オプションの Expression の値がファイル名として求められ、このファイルが追加入力のために使用されます。 後者の場合、最初に記号テーブルとメモリーがクリアされます。 compile は、常にすぐに実行されます。
続く 現行の for または while ループのループ継続試験に制御を移します。
dump [名前] すべてのグローバル変数、またはオプションで Name で指定した変数の名前と現在の値を表示します。 エラーまたは割り込みの後では、 dump は最後のステートメントと (もしあれば) ユーザー関数トレースの番号を表示します。
exit [] システム・レベルに戻ります。 Expression はプロセス状況として戻されます。
実行 即時実行モードに変更します (INTERRUPT キーを押しても、同じ結果になります)。 このステートメントによって、保管されたステートメントが実行されることはありません ( runを参照)。
FOR 指定された変数の制御下で、次のいずれかの構文を使用して 1 つのステートメントまたはステートメントのグループを繰り返し実行します。
for name=Expression Expression statement
next

または

for name=Expression Expression
statement . . . 
next

または

for Expression, Expression, Expression statement
next

または

for Expression, Expression, Expression
statement . . .
next

最初の構文では、1 つのステートメントを指定します。変数は最初の式の値を取り、その値が 2 番目の式の値を超えるまで、ループを行うたびに 1 ずつ増加します。 2 番目の構文を使用してもこれと同じことができますが、2 番目の構文ではステートメントのグループを指定できます。

3 番目の構文では、初期設定式のあとに、検査の式 (真ならば継続など) とループ継続動作の式を指定する必要があります。 4 番目の構文を使用してもこれと同じことができますが、4 番目の構文ではステートメントのグループを指定できます。 3 番目と 4 番目の構文では、コンマを使用して式を区切ってください。

楽しい 次の構文を使用してユーザー作成関数を定義します。
fun f ([a. . . ]) [v. . . ]
statement . . . 
nuf

f にはユーザー作成関数の関数名を指定し、a にはパラメーターを指定し、v にはローカル変数を指定します。 パラメーターとローカル変数は最高 10 個まで指定できます。ただし、アレイにしたり入出力関数に関連付けることはできません。 関数定義をネストすることはできません。

freturn ユーザー作成関数の障害を通知します。 問い合わせがなければ、freturn は 0 をもどします。 (単項尋問演算子 ( ?) を参照してください。) 尋問では、 freturn は尋問された式に転送し、中間関数の戻りをバイパスする可能性があります。
GOTO 名前 Name と一致するラベルを持つコンパイル済みのステートメントに制御を渡します。
ibase n 入力ベースを nに設定します。 n でサポートされる値は、8 10 (デフォルト)、および 16のみです。 16進数の値10-15はアルファベットのa-fとして入力される 16 進数が英字で始まるときは、その英字の前に数字が必要です (例えば、f0a は 0f0a と入力しなければなりません)。 ibase は、常にすぐに実行されます。
の場合 次のいずれかの構文を使用してステートメントを実行します。
if Expression statement
[else
statement . . . ]
fi

または

if Expression
statement . . .
 [else
statement . . . ]
fi

最初の構文では 1 つのステートメントを指定します。2 番目の構文ではステートメントのグループを指定し、式の計算結果がゼロでない場合に続けて使用します。 文字列 0 および "" (null) はゼロと計算されます。

2 番目の構文では、オプションの else を指定することによって、最初のステートメント・グループが実行されなかったときに第 2 のステートメント・グループを実行できます。 else と同じ行に指定できるステートメントは、if だけです。 fis は、他の fi と同じ行にだけ指定できます。 elseif を結合して elif とすることができます。 条件 を閉じることができます。 elif ........... [else .. ] シーケンス (単一の fiを含む)。

include Expression の計算の結果は、プログラム・ステートメントが入っているファイルの名前になります。 このファイルに入っているプログラム・ステートメントは、コンパイルされるプログラムの一部になります。 include ステートメントは、常にすぐに実行されます。 include ステートメントはネストしないでください。
obase n 出力ベースを nに設定します。 n でサポートされる値は、8、10 (デフォルト)、および 16のみです。 16進数の10through15はアルファベットのa~fとして入力される 16 進数が英字で始まるときは、その英字の前に数字が必要です (つまり、f0a は 0f0a と入力しなければなりません)。 ibase と同様に、 obase も常にすぐに実行されます。
onintr 次のいずれかの構文を使用して、割り込みのプログラム制御を行います。
onintr Label

または

onintr

最初のフォーマットでは、 onintr が実行されたときに goto が実行されたかのように、与えられた Label に制御が渡されます。 onintr ステートメントの効果は、割り込みのたびにクリアされます。 2 番目の構文では、INTERRUPT を押すと bs プログラムが終了します。

return [] Expression を計算し、結果を関数呼び出しの値として戻します。 式を指定しないと、この関数はゼロを戻します。
実行 最初のコンパイル済みステートメントに制御を渡します。 乱数発生ルーチンはリセットされます。 ファイルに run ステートメントが含まれている場合は、それが最後のステートメントでなければなりません。 run は常に即時に実行されます。
停止 コンパイル済みステートメントの実行を停止し、即時モードに戻ります。
trace [] 関数トレース機能を制御します。 Expression を指定しない場合、または式がゼロに評価される場合、トレースはオフになります。 それ以外の場合は、ユーザー関数の呼び出し/戻りのレコードが書き込まれます。 各戻りごとに、trace 式の値が 1 ずつ減算されます。
while 指定された変数の制御下で、次のいずれかの構文を使用して 1 つのステートメントまたはステートメントのグループを繰り返し実行します。
while Expression statement
next

または

while Expression
statement . . . 
next

while ステートメントは、ループ継続の条件式だけが指定される点を除いて、for ステートメントと同じです。

!コマンド コマンドを実行してから、bs プログラムに制御を戻します。
# コメント コメント行を挿入します。

式の構文

項目 説明
Name 変数を指定したり、すぐ後ろにコロンが続くときはラベルを指定します。 名前は 1 文字 (大文字または小文字) で構成され、後ろに文字と数字を任意に続けることができます。 意味があるのは、名前の最初の 6 文字だけです。 fun ステートメントでローカルに宣言した名前を除いて、 すべての名前がグローバルです。 名前は、数値 (倍精度浮動小数点) 値またはストリング値を取ることも、入出力と関連付けることもできます (組み込み関数 openを参照)。
「名前」([Expression[, Expression] ) 関数 Name を呼び出し、それに括弧内のパラメーターを渡します。 組み込み関数の場合を除いて、Namefun ステートメントで定義する必要があります。 関数パラメーターは値によって渡されます。
名前[Expression[, Expression].. の場合: 配列または表のいずれかを参照します (組み込み関数 tableを参照)。 アレイの場合、各式は整数に切り捨てられ、名前の指定子として使用されます。 結果として、アレイ参照は構文的に名前と同一になります。[1,2] は [1] [2] と同じです。 切り捨てられた式は、0 から 32,767 の間の値でなくてはなりません。
Number 定数値を表します。 この数値には、整数、10 進数、または浮動小数 (これには数字、オプションの小数点、およびオプションの e の後ろに符号付き指数を含めることができます) を使用できます。
STRING " " (二重引用符) で区切られた文字列を表します。 文字列の中には、エスケープ文字として ¥ (円記号) を使用できます。これを使用すると、二重引用符 (¥")、改行文字 (¥n)、復帰 (¥r)、バックスペース文字 (¥b)、およびタブ文字 (¥t) を文字列内に使用できます。 これらの特殊文字が直後にない場合、¥ はそれ自体を表します。
(expression) 通常の計算順序を変更します。
(, Expression[, Expression] ) [] 括弧の外側の大括弧内の式を、括弧内の式のリストの添え字として使用するときに指定します。 リスト・エレメントには左から順に、0 から始まる番号が付けられます。 次の式は、比較が真であれば、値 True をとります。
(False, True) [a == b]
Expression Operator Expression 演算子が代入、連結、関係演算子でない場合に、演算子が使用される前にオペランドを数字フォーマットに変換します。

単項演算子

項目 説明
? Expression が正しく実行されたかどうかを検査します。その値の検査ではありません。 この問い合わせ演算子は、次に示すような検査に便利です。
  • ファイルの終わり
  • eval 組み込み関数の結果
  • ユーザー作成関数からの戻り ( freturnを参照)

問い合わせトラップ (例えばファイルの終わり) があると、最新の問い合わせに対する即時転送が行われ、代入ステートメントや介入関数レベルを飛ばします。

- Expression を否定します。
+ + 名前 変数 (またはアレイ参照) の値を 1 増やします。
- 名前 変数の値を 1 減らします。
! Expression Expression の論理否定を指定します。

注: 単項演算子は、ヌル・ストリングをゼロとして扱います。

2 項演算子 (優先順位の低いものから)

項目 説明
= 代入演算子を指定します。 左のオペランドは、名前かアレイのエレメントでなくてはなりません。 左のオペランドは右のオペランドの値を取得します。 代入は右から左にバインドします。その他の演算子はすべて、左から右にバインドします。
_ 連結演算子を指定します。 (これは下線文字です。)
& | 論理 AND と論理 OR を指定します。

例えば、

式 &

この式の結果は、両方のパラメーターがゼロでない (真) ときにだけ 1 (真) になります。パラメーターのどちらか、または両方が 0 (偽) のときは 0 (偽) になります。

例えば、

|

この式の結果は、式のどちらか、または両方がゼロ以外 (真) のときは 1 (真) になり、両方の式が 0 (偽) のときだけ 0 (偽) になります。 どちらの演算子も、null 文字列をゼロとして処理します。

< <= > >= == != 次の関係演算子を指定します。
  • < より小
  • <= より小か等しい
  • > より大
  • >= より大か等しい
  • == 等しい
  • != 等しくない

関係演算子は、指定された関係が真のとき 1 を戻します。それ以外の場合は 0 (偽) を戻します。 同じレベルの関係演算子は、次のように拡張されます。 a> b> ca> b & b> cと同じです。 両方のオペランドが文字列の場合は、文字列比較が実行されます。 この比較は、環境変数 LC_COLLATE で指定した照合シーケンスに従って実行されます。

+ - 加算と減算を指定します。
* / % 乗算、除算、および剰余を指定します。
^ 累乗を指定します。

注: 2 項演算子は、ヌル・ストリングをゼロとして扱います。

引数を処理する関数

項目 説明
arg(i) 現在の関数呼び出しレベルで i 番目の実引数の値を戻します。 レベル 0 では、 arg i-番目のコマンド行引数を戻します。 例えば、 arg (0) bsを返します。
narg() 渡された引数の数を戻します。 レベル 0 では、コマンド・ライン引数の数を戻します。

数理関数

項目 説明
abs(x) x の絶対値を戻します。
atan(x) x の逆正接を戻します。
ceil(x) x 以上の整数で最小の整数を戻します。
cos(x) x の余弦を戻します。
exp(x) e の x 乗を戻します。
floor(x) x 以下の整数で最大の整数を戻します。
log(x) x の自然対数を戻します。
ランド() 0 と 1 の間に均等に分散した乱数を戻します。
sin(x) x の正弦を戻します。
sqrt(x) x の平方根を戻します。

文字列関数

項目 説明
size() s のサイズ (文字数) を戻します。
bsize(s) s のサイズ (バイト数) を戻します。
format(f a) フォーマット指定文字列である a, f のフォーマット化された値を、printf サブルーチンのスタイルで戻します。 使用できるのは、%...f%...e、および %...s フォーマットだけです。
index(x y) y にある文字のどれかと一致する文字がある、x 内の最初の位置を戻します。 一致する文字がないときは 0 が戻されます。 2 バイトの拡張文字のときは、第 1 バイトの位置が戻されます。
trans(s f t) f 内の文字と一致するソース・ストリング s 内の文字を、 t内の同じ位置の文字に変換します。 f に表示されないソース文字は、変換されたストリングに変更されずにコピーされます。 文字列 ft より長いときは、f の超過部分の文字と一致するソース文字は変換後の文字列には現れません。
substr(s Start 長さ) Start 位置 (文字数) と Length (文字数) で定義したサブストリング s を戻します。
match(ストリング, パターン) mstring(n) string 内の文字で、pattern と一致する文字の数を戻します。 文字 .*$[]^ (大括弧内のとき)、&#xa5; (および &#xa5;) には、次の特別な意味があります。

注: この特別な表記の詳細については、ed のセクションを参照してください。

.
改行文字を除くすべての文字と一致します。
*
直前のパターン・エレメントの 0 個以上のオカレンスと一致します。 例: .* 改行文字を除く任意の文字の 0 個以上のオカレンスと一致します。
$
行の終わりを指定します。
[.-.]
これは、最初と最後の文字を含め、指定した範囲 ([.-.]) またはリスト ([ . . . ]) 内の任意の 1 文字と一致します。
[^ .-.]
[^ . . . ]
改行文字と範囲またはリスト内の残りの文字を除き、すべての文字と一致します。 曲折アクセント記号 (^) は、左大括弧の直後にあるときにだけこの特別な意味を持ちます。
[].-.]
[] . . . ]
] またはリスト内のすべての文字と一致します。 右大括弧がリスト内の最初の文字 (最初に ^ がある場合はその後ろ) であるときには、右大括弧はリストの終了を意味しません。
\( . . . \)
サブストリングをマークし、そのサブストリングに正確に一致します。パターンは文字列の最初から、考えられる最長の文字列に一致しなくてはなりません。 例えば、次の例について考えてみましょう。
match ('a123ab123',".*\([a-z]\)") = 6

このインスタンスでは、.* が次の値に一致する a 123a(a から z の範囲の文字の前にある最長のストリング)。\ ([a-z]\)が次の値に一致するbストリング内で合計 6 文字が一致します。 次のような式の中で、[a-z], マイナスは、現行の照合シーケンスに従った「範囲」を意味します。

照合シーケンスは文字範囲内で使用する等価クラスを定義できます。 照合シーケンスと等価クラスの詳細については、International Character Support Overview のセクションを参照してください。

mstring 関数は、 match への最後の呼び出しで n番目のサブストリングを戻します (n は 1 から 10 までの範囲でなければなりません)。

ファイル処理関数

open(名前、ファイル、モード)

項目 説明
close(名前) 名前、ファイル・タイプ、およびファイル・モードを指定します。 Name には正式な変数名 (文字列として渡される) を指定しなくてはなりません。 クローズ後は、その名前は通常の変数になります。 オープンの場合、File には次のいずれかを指定できます。
  • 0 (標準入力の場合)
  • 1 (標準出力の場合)
  • 2 (エラー出力の場合)
  • ファイル名を表す文字列
  • 「!」で始まるストリング 実行するコマンドを表す("sh-c")

Mode には、r (読み取り)、w (書き込み)、W (改行文字なしの書き込み)、または a (追加) のいずれかを指定しなくてはなりません。 関連付けの初期状態は次のとおりです。

  • open ("get", 0, "r")
  • open ("put", 1, "w")
  • open ("puterr", 2, "w")
アクセス(p, m) access サブルーチンを実行します。 パラメーター p にはファイルのパス名を指定し、m には要求されたアクセス・モードを表すビット・パターンを指定します。 この関数は、システム要求が許可されると 0 を戻し、システム要求が拒否されると -1 を戻します。
ftype (s) ファイル・タイプを表す 1 文字を戻します。通常ファイルの場合は f、FIFO の場合は p (名前付きパイプ)、ディレクトリーの場合は d、ブロック・スペシャル・ファイルの場合は b、文字スペシャル・ファイルの場合は c が戻されます。

表関数

項目 説明
table(名前、サイズ) 関連的にアクセスされる 1 次元アレイを指定します。 「添え字」(コール・キー) は文字列です (数字は変換されます)。 Name には (文字列として渡される) bs 変数名を指定しなくてはなりません。 Size は、割り当てられるエレメントの最小数を設定します。 テーブルがオーバーフローすると、bs はエラー・メッセージを書き込みます。
item(名前, i)  
キー () キー値に従って規則正しくアクセスする代わりに、テーブル・エレメントに順次にアクセスします。 item 関数が値にアクセスするとき、key 関数は直前の item 呼び出しの「添え字」にアクセスします。 Name は引用符で囲まないでください。

正確なテーブル・サイズは定義されていないので、テーブルの終わりを検出するには問い合わせ演算子が使用されます。例を次に示します。

table("t",100)

               
.
.
.
#If word contains "parity", the following expression
#adds one to the count of that word:
++t[word]
.
.
.
#To display the key/value pairs:
for i = 0, ? (s = item (t, i)), ++i if key( ) put = key
( )_":"_s
iskey(名前、ワード) テーブル名にキーワードがあるかどうかを検査し、真のときは 1、偽のときは 0 を戻します。

その他の関数

項目 説明
eval(ストリング) string パラメーターを式として計算することを指定します。 この関数は、数値ストリングを数値に変換する場合に便利です。 eval は、以下のように、間接参照の粗い形式として使用することもできます。
name = "x,y,z"
eval("++"_name)

変数を増分します。"x,y,z". さらに、 eval の前に? が付きます。 (問い合わせ演算子) を付けると、 bs エラー条件を制御できます。 次に例を示します。

?eval ("open(\"X\",\"XXX\", \"r\")")

指定されたファイルがない場合は、値ゼロを戻します。"XXX"(プログラムを停止する代わりに)。 次の例では、ラベル「L:」(もしあれば) に対して goto を実行します。

label = "L:"
if! (?eval ("goto"_label))puterr="no label"
plot(要求、引数) tplot コマンドで認識されるデバイスに出力します。 要求によっては、すべてのプロッターに適用できないものもあります。 0 と 12 以外のすべての要求は、文字を tplot に入力することによって実行されます。

呼び出し要求には、次のものがあります。

plot(0, term)
-T (T)用語。 のフラグを使用して、追加のプロット出力を プロット にパイプ接続します。
プロット (1) (plot (1))
プロッターを消去します。
plot (2, 文字列)
現行ポイントに string でラベルを付けます。
plot (3, x1, y1, x2, y2)
(x1, y1) と (x2, y2) の間に直線を引きます。
plot(4, x, y, r)
中心が (x, y)、半径が r の円を描きます。
plot (5, x1, y1, x2, y2, x3, y3)
中心が (x1, y1)、終点が (x2,y2)(x3, y3) の円弧を (反時計回りに) 描きます。
プロット (6) (plot (6))
実行できません。
plot(7, x, y)
現行ポイントを (x, y) にします。
plot(8, x, y)
現行ポイントから (x ,y) に直線を引きます。
plot(9, x, y)
(x, y) に点を描きます。
plot (10, 文字列)
行モードを文字列に設定します。
plot (11, x1, y1, x2, y2)
(x1, y1) をプロット域の左下端とし、(x2, y2) をプロット域の右上端とします。
plot (12, x1, y1, x2, y2)
プロットの前に、後続の x(y) 座標が x1 (y1) 倍され、その結果が x2 (y2) に加算されます。 初期のスケーリングは plot (12, 1.0, 1.0, 0.0, 0.0) です。
last () (最後の) 即時モードでは、最新の計算値を戻します。

bs コマンドを実行し、結果を output というファイルに送るには、次のように入力します。

bs < input.n > output

または

bs input.n > output