プログラム電卓用言語(Numeric Basic)


仕様の概要

この「プログラム電卓」ではBASIC風の言語でプログラムを書きます。 この言語では(通常のBASICとは異なり)文字列は使えません。 数値だけを扱うとします(Numeric Basicと呼びます)。

Numeric Basicのプログラムは一つまたは複数の行で構成されます。 通常は行の順に実行されます。 一つの行は行番号の後に一つまたは複数のステートメントが続いたものです。 複数のステートメントはコロンで区切ります。 GOTOなどの行き先になっていない行には、行番号は必要ありません。 また、行番号は番号順でなくても構いません。 空行は無視されます。

キーワードは大文字と小文字の区別はありません (定数名と変数名の大文字と小文字は区別されます)。 キーワードは空白または記号で区切る必要があります。

式の値を真理値として考えるときは、0 のときは偽、それ以外のときは真とします。

グラフィックス領域は最大横640ピクセル、縦640ピクセルとします。 グラフィックス領域に描画される疑似グラフィックスは最大横80ピクセル、縦80ピクセルとします。

ステートメント

ステートメントには以下のものがあります。

ステートメント 説明
変数名 = 式 変数に式の値を代入します(代入文)。この後変数を使うと代入された値を参照することができます。
PRINT 式 結果領域に式の値を表示します。
? 式
INPUT 変数名 実行すると、入力領域に「変数名 =」と表示されます。 この領域に数値(または式)を入力してOKボタンを押すと、 入力領域の代入文が実行された後、 次のステートメントに処理を移動します。
GET 変数名 実行すると、入力領域に「変数名 =」と表示されます。 この領域に数値(または式)を入力すると、 入力領域の代入文が実行された後、 次のステートメントに処理を移動します。 入力がないときは0が代入されます。
REM 任意の文字列 REMまたは「'」(シングルコーテーション)の後に任意のコメント(行末まで)を書くことができます。このステートメントの処理は何も行われません。
' 任意の文字列
GOTO 行番号 行番号で指定された行に処理を移動します。
GOSUB 行番号 行番号で指定された行に処理を移動し、その後RETURNステートメントが実行されると次のステートメントに戻ります。
RETURN GOSUBステートメントが実行された後に実行されると、直前のGOSUBステートメントの次のステートメントに戻ります。
IF 式 GOTO 行番号 式の値が真のとき行番号で指定された行に処理を移動します (式の値が偽のときは次のステートメントに移動します)。
IF 式 THEN 行番号
IF 式 GOSUB 行番号 式の値が真のとき行番号で指定された行に処理を移動し、その後RETURNステートメントが実行されると次のステートメントに戻ります。 (式の値が偽のときは次のステートメントに移動します)。
IF 式 THEN ステートメント 式の値が真のときステートメントを実行します (式の値が偽のときは次の行に移動します)。 ステートメントを複数書くと複数のステートメントを順に実行することができます。
ON 式 GOTO 行番号1, 行番号2,…, 行番号n 式の値が1のとき行番号1で指定された行、式の値が2のとき行番号2で指定された行、…に処理を移動します (式の値が1からnの範囲外のときは次のステートメントに移動します)。
ON 式 GOSUB 行番号1, 行番号2,…, 行番号n 式の値が1のとき行番号1で指定された行、式の値が2のとき行番号2で指定された行、…に処理を移動し、その後RETURNステートメントが実行されると次のステートメントに戻ります。 (式の値が1からnの範囲外のときは次のステートメントに移動します)。
FOR 変数名 = 式1 TO 式2 STEP 式3 処理の繰り返しを開始します。 「STEP 式3」は省略することができます。省略すると式3の値が1として動作します。 まず変数名で表される変数に式1の値を代入します。 繰り返しの条件が成り立つとき、FORステートメントの次のステートメントに移動します。 繰り返しの条件が成り立たないときは、対応するNEXTステートメントの次のステートメントに移動します。 繰り返しの条件は、 式3の値が正(または0、0は意味がないので指定しなようにしてください)のときは、「変数の値≦式2の値」、 式3の値が負のときは、「変数の値≧式2の値」となります。 FOR~NEXTの中にFOR~NEXTを書くことができます(ネストと言います)。 FOR~FOR~NEXT~NEXTのようになっているとき、内側のFORと内側のNEXT、 外側のFORと外側のNEXTが対応しています。 対応するNEXTステートメントとは、 ネストがない場合は次に現れるNEXTステートメントとなります。 ネストがある場合は対応するFOR~NEXTを除いた、次に現れるNEXTステートメントとなります。
NEXT 変数名 処理の繰り返し部分の終わりを表します。変数名は省略することができます。 対応するFORステートメントの変数名で表される変数に式3の値(省略時は1)を加えます。 繰り返しの条件(FORステートメントの繰り返しの条件と同じ)が成り立つとき、対応するFORステートメントの次のステートメントに移動します。 繰り返しの条件が成り立たないときは、NEXTステートメントの次のステートメントに移動します。 対応するFORステートメントとは、 ネストがない場合はNEXTステートメントの前の最後の(変数が指定された場合はその変数の)FORステートメントとなります。 ネストがある場合はNEXTステートメントの前の、対応するFOR~NEXTを除いた、最後の(変数が指定された場合はその変数の)FORステートメントとなります。
DEF 関数名(変数名) = 式1 「一行関数」を定義します。 S-BASICでは関数名はFNA、FNB、…などに限られますが、このNumeric Basicでは変数名と同様の文字列とします。 このステートメントを実行した後、式の中で「関数名(式2)」を使うと、その値は 式1の指定された変数名の変数を式2で置き換えた式の値となります。 このとき指定された変数以外の変数の値はその時点で定義された値となります。 指定された変数と同じ名前の変数があっても、その変数の値は「関数名(式2)」を使う前後で変更されません。
STOP プログラムを一時停止します。Contボタンで再開することができます。
END プログラムを終了します。
SET 式x, 式y 「疑似グラフィックス」の(式x, 式y)の位置に点を描画します。
RESET 式x, 式y 「疑似グラフィックス」の(式x, 式y)の位置の点を消去します。
CIRCLE (式x, 式y), 式r グラフィックス領域に中心(式x, 式y)、半径式rの円を描画します。
LINE (式x1, 式y1) - (式x2, 式y2) グラフィックス領域の位置(式x1, 式y1)と位置(式x2, 式y2)の間の線分を描画します。
LINE - (式x, 式y) グラフィックス領域の前回描画した位置と位置(式x, 式y)の間の線分を描画します。
PSET (式x, 式y) グラフィックス領域の位置(式x, 式y)に点を描画します。
PRESET (式x, 式y) グラフィックス領域の位置(式x, 式y)の点を消去します。
PAINT (式x, 式y) グラフィックス領域の位置(式x, 式y)を含む、囲まれた領域を塗りつぶします。
CLS グラフィックス領域を消去します。
PUT (式x, 式y), 式n グラフィックス領域の位置(式x, 式y)に、式nで指定された文字(パターン)を描画します。 nが0から11までは既定のパターンが定義されています。
GET (式x, 式y), 式n グラフィックスのPUTステートメントに対応するステートメントです。 グラフィックス領域の位置(式x, 式y)から、式nで指定された文字にパターンを取り込みます。
GET $16進数, 式 グラフィックスのPUTステートメントに対応するステートメントです。 式nで指定された文字に16進数で指定されたパターンを取り込みます。
TPENDOWN タートルグラフィックスのペンをつけた(描画できる)状態にします。
TPENUP タートルグラフィックスのペンを離した(描画できない)状態にします。
TTURNLEFT タートルグラフィックスのタートルの向きを左に90度回転します。
TTURNRIGHT タートルグラフィックスのタートルの向きを右に90度回転します。
TTURN 式 タートルグラフィックスのタートルの向き式の値で指定された角度だけ回転します。
TMOVE 式 タートルグラフィックスのタートルの向きに、式の値で指定された長さだけ移動します。このときペンをつけた状態であれば線分が描画されます。
TMOVETO (式x, 式y) タートルグラフィックスのタートルを、位置(式x, 式y)に移動します。このときペンをつけた状態であれば線分が描画されます。

式は以下のものがあります。 演算子の優先順位は後述します。 結合の順序を変えるためにかっこを使うことができます。
  式 二項演算子 式
  単項演算子 式
  関数名(式)
  変数名
  数値
  定数名

二項演算子

以下のものがあります。

演算子 意味
+ 加算
- 減算
* 乗算
/ 除算
^ 累乗
== 等しい
<> 等しくない
><
< 小さい
<= 小さいか等しい
=<
> 大きい
>= 大きいか等しい
=>

単項演算子

演算子 意味
- 符号を変える

関数名(式)

関数の値を計算します。 関数は以下のものがあります。

名前 意味
SIN 正弦関数
COS 余弦関数
TAN 正接関数
SINH 双曲線正弦関数
COSH 双曲線余弦関数
TANH 双曲線正接関数
ASIN 逆正弦関数
ACOS 逆余弦関数
ATN 逆正接関数
ATAN
ASINH 逆双曲線正弦関数
ACOSH 逆双曲線余弦関数
ATANH 逆双曲線正接関数
EXP 指数関数
LN 自然対数関数
LOG 底 10 の対数関数
LOG10
LOG2 底 2 の対数関数
SQR 平方根
SQRT
CBRT 立方根
ABS 絶対値
SGN 符号を示す数値(正のとき1、0のとき0、負のとき-1)
SIGN
INT 指定した数以下の数のうち、最大の整数値
FLOOR
CEILING 指定した数以上の数のうち、最小の整数値
ROUND 最も近い整数
TRUNCATE 整数部(0 に向かって最も近い整数)
RND 0 以上 1 未満のランダムな浮動小数点数を発生(引数は無関係)。

変数名

変数名は英文字または「_」(アンダースコア)で始まり、 その後に英文字または「_」または数字が続くものです。 大文字と小文字は区別されます。 代入されていない変数を参照することはできません。 同じ名前の変数はどこで使っても同じものとなります(グローバル変数)。

数値

数値は数字か小数点の列です(小数点は1個)。

定数名

定数は以下のものがあります。定数名の大文字と小文字は区別されます。

名前 意味
E 自然対数の底
π 円周率
PI
GWIDTH グラフィックス領域の横のピクセル数
GHEIGHT グラフィックス領域の縦のピクセル数

演算子の優先順位

優先順位の高い順で以下のような順となります。
演算子 意味
^ 累乗
- (単項) 単項の符号を変える演算子
*、/ 乗法、除法
+、– 加法、減法
==、<>、><、
<、<=、=<、
>、>=、=>
関係演算子

補足

この「プログラム電卓」で採用した言語は、 プログラム電卓(Wikipedia) (この記事によるとポケットコンピュータと呼ぶ方が良いかもしれません) で使われているBASICを採用した方が電卓的に使いやすいし、 (途中で止めることができないと使いにくいので)一行ごとに実行するのも簡単にできそうということでBASIC風にすることにしました。 (しかしもっと普及している言語でも電卓的に使うことや途中で止めることはできたかもしれません。プログラムが行単位になっていないような言語でもデバッガーのブレークポイントは行単位で指定できるのでできるとは思いますが、デバッガーを作るぐらいの手間が必要になるかもしれません。)

Numeric Basicの言語を構成する要素はS-BASIC (S-BASIC(Wikipedia) 参照)からいくつかの要素を取り入れています(SP-5030は使ったこともあり情報も公開されているため主にSP-5030)。

S-BASIC(実際はSP-5030)はグラフィックスの機能がありません。 文字の表示でグラフィックスのような機能を実現したもの(疑似グラフィックス)があります。 グラフィックスの機能を扱うために初期のMicrosoft BASIC (Microsoft BASIC(Wikipedia) 参照) を参考にしました。 実際にはグラフィックスの要素はQuickBASIC (QuickBASIC(Wikipedia) 参照)から(初期のMicrosoft BASICの仕様は不明だがQuickBASICは本があったため)、 タートルグラフィックスの要素はSmall Basic (Small Basic(Wikipedia) 参照)から 取り入れています(Webで仕様がわかるため)。

初期のMicrosoft BASICとは1980年頃のPC用のBASICで使われた BASIC(Wikipedia) の「構造化以前のBASIC」に相当するものです。 S-BASICも同じ時代に使われていて仕様は似ています。 Numeric Basicはこのような言語を参考にしていますが、異なる部分もあります。


2022年9月15日 Ver.2.00