BASIC でプログラミング再入門

プログラミングといえば、いつの時代も BASIC です。僕は小学生の頃、すでにガラクタと化していた MSX2 マシーンに取扱説明書のサンプルプログラムをしこしこ打ち込んで遊ぶという、活発で健康的なレクリエーションをしていました。残念ながら、僕の梅干しサイズの脳みそでは何も理解できませんでしたが、あの頃より多少神経回路も発達したはずなので、今 BASIC に再入門することにしました。

不幸にも現代のパソコンには BASIC インタプリタが標準搭載されていません。BASIC 界の雄であった Microsoft も、Windows に BASIC を組み込む気配がありません (VBScript…?)。

しかたないので、Vintage BASIC というオープンソースのインタプリタを使います。Windows, Mac OS X, Linux のバイナリも配布してますので、簡単です。なお、vintbas は対話型でないので、第一引数にソースファイルのパスを渡す必要があります。*nix ユーザなら問題ないでしょうが、Windows ユーザが同梱のサンプルコードを動かすには、cmd で 以下のようにします:

cd "Vintage BASIC のディレクトリ"
bin\vintbas examples\diamond.bas

以下で BASIC の文法を紹介します。

※BASIC ソースの各行の先頭はラベルという数で始まる必要があります。普通は 10, 20, 30, … という風に数を振っていきます。GO TO などの制御文でラベルを使います。ここでは、めんどいので vim で行番号を表示しながら編集し、cat -n で後からラベルを足しています。

まずは PRINT ステートメントです:

     1  REM Windows XP 環境なので、文字コードは CP932 です。
     2  REM 空行は許されないので、REM (remark = コメント) を入れます。
     3  REM
     4  REM 文字列は引用します。
     5  PRINT "こんにちは、世界!"
     6  REM
     7  REM 複数の文字列や数を表示するには、セミコロンで区切ります。
     8  REM 数の前後には空白が 1 つ入るみたいです。
     9  PRINT "大至急";1000000;"円を";"振り込んで下さい。"
    10  REM
    11  REM 表を書くには、カラムをコロンで区切ります。1 カラムは 14 文字幅です。
    12  PRINT "商品名","価格"
    13  PRINT "モxスター",200
    14  PRINT "リxビタンゴールド",315
    15  PRINT "レxドブル",275

以下実行結果です:

こんにちは、世界!
大至急 1000000 円を振り込んで下さい。
商品名        価格
モxスター      200
リxビタンゴールド            315
レxドブル      275

次はスカラー変数です。型を示すために Perl のシジル的なものが必要です。

     1  REM 変数名は /[A-Z]{1,2}[0-9]?/ という風に、基本的に英字 2 文字です。
     2  REM 数字を 1 文字、末尾に付けることもできるらしいです。
     3  REM
     4  REM 文字列型は 変数名$ です。
     5  A$ = "こんにちは、"
     6  B$ = "世界!"
     7  PRINT A$;B$
     8  REM
     9  REM 整数型は 変数名% です。
    10  C% = 1000000
    11  PRINT "大至急";C%;"円を";"振り込んで下さい。"
    12  REM
    13  REM 実数型は 変数名 です。
    14  D = 3.14
    15  E% = 5
    16  PRINT E% * E% * D

以下実行結果です:

こんにちは、世界!
大至急 1000000 円を振り込んで下さい。
 78.5

次は INPUT ステートメントです。標準入力からデータを受け取ることができます:

     1  INPUT "きみの名前を教えて";A$
     2  INPUT "きみはいくつ";B%
     3  PRINT "個人情報を取得しました: ";A$;" (";B%;"歳)"

以下実行結果です:

きみの名前を教えて? 太郎
きみはいくつ? 42
個人情報を取得しました: 太郎 ( 42 歳)

次は IF ステートメントと GOTO ステートメントです。GOTO は指定したラベルに制御を移します:

     1  INPUT "年齢を教えて下さい"; A%
     2  IF A% < 20 THEN PRINT "あなたは未成年です。":GOTO 4
     3  PRINT "あなたは成人です。"
     4  PRINT "おわり"

以下実行結果です:

年齢を教えて下さい? 19
あなたは未成年です。
おわり

ELSE なんて便利なものはないので、GOTO で ELSE 節に相当する部分を飛ばす必要があります。

関係演算子は =, <>, <, >, 条件演算子は NOT, AND, OR があります。

次は FOR ステートメントです:

     1  REM ループカウンタは実数型でないといけません。
     2  FOR I=1 TO 6 STEP 2
     3  PRINT I
     4  NEXT I

以下実行結果です:

 1
 3
 5

NEXT を忘れるとループしないので気を付けましょう。

次は配列です。配列にも型に応じてシジルが必要です:

     1  S=5
     2  REM 1 次元で長さが S の配列を作ります。
     3  DIM A$(1,S)
     4  REM ----------------------------------------
     5  FOR I=1 TO S
     6  A$(1,I)=STR$(I)+"つ"
     7  NEXT I
     8  REM ----------------------------------------
     9  FOR I=1 TO S
    10  PRINT A$(1,I)
    11  NEXT I

以下実行結果です:

 1つ
 2つ
 3つ
 4つ
 5つ

STR$ 関数は数を文字列に変換します。文字列の連結は + 演算子を使います。

今気付きましたが、ファイルの操作はできないみたいです。なんてこったい。

ともあれ、次はサブルーチンです:

     1  GOTO 7
     2  REM ----------サブルーチン始まり----------
     3  INPUT "お名前は";A$
     4  Z9$ = "こんにちは、" + A$ + "。" + Z1$
     5  RETURN
     6  REM ----------サブルーチン終わり----------
     7  Z1$ = "ご機嫌いかが?"
     8  GOSUB 3
     9  PRINT Z9$
    10  PRINT "おわり"

以下実行結果です:

お名前は? 太郎
こんにちは、太郎。ご機嫌いかが?
おわり

次は関数です:

     1  DEF FN F1$(A, B) = STR$(A) + "," + STR$(B)
     2  PRINT FN F1$(10, 20)

以下実行結果です:

 10, 20

戻り値に応じたシジルを付ける必要があります。また、式しか書けないので不便です。

構造体なんてイカしたものはありません。ひたすら GOTO, GOSUB を駆使してどうにかするのでしょう。レキシカルスコープなんてものはないし、とにかく大変です。

ともかく、再入門なんてしないほうがいい、ということが分かりました。悲しい結論です。

(コウヅ)

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中