• 検索結果がありません。

使用雑感 構造化 BASIC フリーです 汎用性があるコードです 日本語対応 :Linux 版 コツはあるけど日本語対応 :Windows 版 非日本語 :Android 版 X11-BASIC とは Markus Hoffmann 氏が開発した由緒正しい GNU GPL のフリーで使える BASI

N/A
N/A
Protected

Academic year: 2021

シェア "使用雑感 構造化 BASIC フリーです 汎用性があるコードです 日本語対応 :Linux 版 コツはあるけど日本語対応 :Windows 版 非日本語 :Android 版 X11-BASIC とは Markus Hoffmann 氏が開発した由緒正しい GNU GPL のフリーで使える BASI"

Copied!
207
0
0

読み込み中.... (全文を見る)

全文

(1)

Writer HOLY

2016/06/18

(2)

使用雑感

・構造化 BASIC

・フリーです

・汎用性があるコードです

・日本語対応:Linux 版

・コツはあるけど日本語対応:Windows 版

・非日本語:Android 版

 X11-BASIC とは、Markus Hoffmann 氏が開発した由緒正し

い GNU GPL のフリーで使える BASIC です。コードの汎用性

について触れますと X11-BASIC の Windows 版、Linux 版互換

です。PC を持ってるのでしたら、SouceForge から

X11-BASIC をダウンロードして使うことができます。で、そ

の PC 版と Android 版のコードは、ハードウェア固有の命令

でなければ修正せずに動きます。ここが美味しいところで

す。ただし同じ BASIC というカテゴリーでも、X11-BASIC の

コードと、VisualBasic や GAMBAS とは色々違います。それ

でもプログラム構造が同じなら移植もそんな苦ではありま

せん。

 SouceForge で X11-BASIC と検索して、その説明を読むと

「UNIX の基本」と一文だけ書かれている。それほど UNIX で

はお手軽に使える BASIC だと思います。"BASIC of UNIX"が

直訳されたんでしょうが。私も、仕事で Solaris や Linux

を使いますが、大きなプログラムを作るためではなくて、

(3)

スクリプト感覚で計算させるのに使ったりします。今はス

マフォで Android 版を使うけれども、将来的に PC を使うよ

うになったらコードの使い回しが効くんじゃないかなと。

機能とか流行とかはさておき、使うのにお手軽な BASIC だ

と思います。

 コンパイラソースやサンプルプログラム

を/usr/share/doc/packages/X11Basic/examples 以下に探す

ことができます。他のサンプルプログラムは、

Sourceforge.net の X11-BASIC から、

X11-Basic-examples-1.22.zip をダウンロードできます。同

じく最新マニュアルの PDF(英語)もそこにあります。

 更にために情報はファイル./doc/X11-Basic-manual.txt

を読んでください(これも英語ですな)。

 X11-BASIC は、オープンソースソフトウェアであり、NO

WARRANTY です。Copy Right は次のとおりです。ありがたや。

VERSION 1.22

(C) 1997-2014 by Markus Hoffmann (kollo@users.sourceforge.net) Name : X11Basic

Version : 1.22

Vendor : Markus Hoffmann

Group : Development/Languages License : GPL

(4)

URL : http://x11-basic.sourceforge.net/

Summary : A Basic Interpreter and compiler with graphics capabilities

 基本的にオープンソースなので好きなように修正してい

ただいて結構ですが、そうすることで発生するあらゆる種

類のトラブルに我々は一切関知しない。(ということです)

導入前の注意

 BASIC というプログラミング言語には、方言がつきものに

なっています。国際標準で定義された仕様もあるんですが、

技術レベルや時代の要求に追いついてない状況で、使用場

面に応じた文法や決めごとがまかり通っています。

 X11-BASIC もそんな方言の中のひとつで、言語仕様どころ

か、その名称も似た BASIC が存在してます。ここでは、そ

ういう言語名称による誤解を避けるためいくつか注意を促

しておきます。

 名前の似た BASIC として、

(1)X11-BASIC

(2)XBasic

(3)X-BASIC

という名前の BASIC が存在しています。べつに商標とか本

家本元論とかを話したいわけじゃなくて、名前の勘違いを

(5)

しないようにね、ということです。うっかりした勘違いで

回り道をしないように。

 それぞれの違いは、こんな感じです。

(1)X11-BASIC

 この本で取り扱おうとしてる BASIC です。対応機種/OS

は、Linux、Windows、Android です。

 もともとは、ATARI GFA-BASIC のクローンを目指して開発

が始まりました。

 名称の先頭が「X11」で、その後にハイフンを付ける人や、

付けない人もいるようです。

(2)XBasic

 XBasic という名称の BASIC は結構あるようです。検索す

ると知ってるのも知らないのも出てきます。

 その中でも、もっとも熟れているのは次の XBasic でしょ

う。

 http://www.maxreason.com/software/xbasic/xbasic.html

 これは今でも開発が続いていて、SourceForge でも活発な

動きがあります。

 http://sourceforge.net/projects/xbasic

 対応機種/OS は、Linux、Windows です。

 Microsoft Quick-BASIC 風な文法の流れを汲むそうです。

GUI 開発用の IDE も相当作り込まれています。

(6)

 名称は頭文字が X で、B は大文字、asic は小文字で書く

人が多いようです。

(3)X-BASIC

 SHARP が販売していた X68000 の BASIC です。現在でも日

本で X-BASIC と言えばコレをあげなければモグリと言われ

ます。その辺が、X11-BASIC がいまいち日本で浸透しない理

由なんですかねぇ。

 X68000 の技術は、本舗 SHARP が仕様を公開していること

から、エミュレータに移植したり未だに活動が行われてい

ます。

 その中で、iOS で動かせる「X-BASIC for iOS」(AIG

Soft)が App Store に公開されています。

 このようにアルファベット「X」には、どうもマニア心を

くすぐるものがあるらしいです。

(7)

インストール

 X11-Basic SourceForge のコメント(機械翻訳)より

 『UNIX の基本』

詳細情報

開発状況: 5 - プロダクション/安定, 6 - 成熟 対象ユーザ: 開発者, 教育, 科学/研究

ライセンス: GNU General Public License v2 (GPLv2) 主要対話語: 英語, ドイツ語

オペレーティングシステム: Cygwin (MS Windows), Android, POSIX (Linux,BSD,Solaris など), Linux, その他, Windows XP

プログラミング言語: BASIC, C トピック: SourceForge.net, CGI ツール/ライブラリ, インタプリタ, 仮想 マシン ユーザインタフェース: フレームバッファ, タブレット PC, X11 アプリケー ション, コマンドライン, SDL, Win32 (MS Windows)

 X11-BASIC はグラフィック機能のある BASIC です。その文

法は、昔の ATARI-ST(アタリ社)が 1985 年発売したパソコン

用(CPU は MC68000)の GFA-BASIC(初版 1986 年)のクローンを

目指して開発が始められました。日本にはあまりいないと

思いますが、GFA-BASIC の経験者は若干の修正で習熟できる

はずです。当時のパソコンの世界では各社独自の GUI の開

発花盛りでして、ATARI でも独自の GEM という GUI システム

を提供してました。GUI 関係の命令にその一端を垣間見るこ

とができます。

(8)

 また、MS-DOS の QBASIC(Borland 社対抗の Microsoft

QuickBASIC の簡易版)のプログラマーもほぼコンパチブルで

す。おそらくこっちのほうが馴染みのある人が多いことで

しょう。

UNIX/Linux 版

 X11-BASIC のマニュアルやら ReadMe を読むと、

./configure make

sudo make install

でいけると思います。不肖私が行ったインストールの備忘

録をさらしますと、こんなことをしていました。

$ ls (saucefoege.com からダウンロードしたファイル) X11Basic-1.22.tar.gz $ gzip -d X11Basic-1.22.tar.gz (圧縮ファイルを解凍) X11Basic-1.22.tar

$ tar -xvf X11Basic-1.22.tar (tar アーカイブを展開した) $ ls X11Basic-1.22 X11Basic-1.22.tar $ cd X11Basic-1.22 $ ./configure (中略) $ make (中略)

(9)

$ cd ..

$ su (root になります) パスワード:

(make install はしないで動かせるように細工をしました)

# mv X11Basic-1.22 /usr/local (/usr/local 以下に作ることにした) # cd /usr/local/X11Basic-1.22 # cp libx11basic.so.1.22 (ver.1.22 なら 1.22 をコピー) # cp x11basic.a /usr/lib # chmod 755 /usr/lib/libx11basic.so.1.22 # chmod 755 /usr/lib/x11basic.a

 最後に、ホームディレクトリ直下の.bashrc の

alias xbasic='/usr/local/X11Basic-1.22/xbasic' alias xbc='/usr/local/X11Basic-1.22/xbc'

のように入れました。

 X11-BASIC のパッケージには、xbasic というインタプリ

タと一連のコンパイラが含まれています。インタープリタ

は、basic-script とでも言えるようなシェルスクリプト風

に利用することもできます。

 パッケージにはコンパイラ(xbc)も、含まれます。コンパ

イラはインタプリタに比べてだいたい 10 倍早くなります。

 恐らく saucefoege.com には、deb パッケージもダウン

ロードできるようになってるので Ubuntu 系のディストリ

ビューションなら、パッケージインストーラーでインス

(10)

トールする手もあります。ただこの場合だと、コマンドラ

インインタプリタを試す分には問題ありませんでしたが、

xbc でコンパイルしようと実行するとリンクエラーが出て上

手くいきませんでした。

 X11-BASIC プログラムを、中間バイトコードにコンパイル

することもできます(xbbc)。このバイトコードは、仮想マ

シンによって動作できます(xbvm)。その中間バイトコード

は、環境ネイティブの C 言語でコンパイル可能な C ソース

コードに変換できます(xb2c)。

 古の ANSI-Basic プログラム(行番号つき)を、

bas2x11basic を使うことで X11-BASIC コードに変換できま

す。

Android 版

(11)

 Android バージョンの X11-BASIC は、通常のアプリとして

Android Market からダウンロードできます。他のバージョ

ンの X11-BASIC のとは異なり、Android バージョンでは、イ

ンタープリタ、それを動かす仮想マシン、Load して、Run

して、Edit して、コンパイルする一連の操作ができるよう

な IDE として組み込まれます。同じく標準出力となるテキ

ストコンソールにも、少なからずな修正が加えられてます。

標準入力デバイスはキーボードとしてます。

 それらのアイデアは、起動直後にダイレクトステートメ

ントを実行できることに配慮して、シンプルに扱えるよう

にしたからです。もちろん、拡張子.bas のソースプログラ

ムを Load して Run させても大丈夫です。それに拡張子.b の

コンパイル済みのバイトコードを実行させることもできま

す。

 Android では、BASIC プログラムのソースファイルは bas

フォルダ(/mnt/sdcard/bas)に保存して実行してください。

ソースファイルの拡張子は.bas です。コンパイルした実効

ファイル(拡張子.b)もそこで Load してから Run するという

形式になります。また、Android 版でも、コンソールに直接

命令や式(数字を含む)を入力して実行するダイレクトス

テートメントを使うことが出来ます。

 Android 版の X11-BASIC ではエディタアプリも一緒にイン

ストールしましょう。詳しく書くとちょっと長くなるので

ここでは書きませんが、X11-BASIC のメニューに「どのアプ

(12)

リをエディタに使う?」という項目があります。そのほう

が絶対楽です。

Windows 版

 適当なフォルダを作成しておきます(例えば「X11BASIC」

とか)。場所は Program Files 以下でも、マイドキュメント

フォルダ以下でも構いません。SaurceForge などから

Windows 用 zip ファイルをダウンロードして解凍します。

WindowsXP 以上ならダブルクリックすれば中身が表示される

と思うので、それらをドラッグして先ほど作っておいた

フォルダに移します。

 その中に、xbasic.exe という実行形式ファイルがあるの

で、それをダブルクリックしてください。コマンドプロン

プトみたいな黒いスクリーンが現れると思います。それが

X11-BASIC のコンソールです。閉じるにはウィンドウの

「x」ボタンを押して終了させても構わないんでしょうが、

丁寧に終了するにはプロンプトで「quit」と入力して終了

しましょう。

 注意ですが、解答したファイルの中に setup.exe があり、

あたかもこれを実行すればインストールし始めますよ、み

たいな雰囲気をだしてると思います。私の経験ではそれは

実行させないほうが良いですね。確かに実行すると

X11-BASIC をインストールするんですが、X11-BASIC が C ド

ライブの直下に作られたり、拡張子「BAS」とつくファイル

(13)

をすべて X11-BASIC に関連付けられてアイコンも変わりま

す。親切とも言えなくはないのですが、余計なお世話です。

解凍したファイルの xbasic.exe で BASIC が起動できて使え

るならそれでいいじゃん?と思います。

 あとコンパイラ xbc を使うには、ソースファイルを

X11-BASIC をインストールしたフォルダに持ってきて、

「xbc [ソースファイル名]」とするのがお約束みたいです。

このフォルダにパスが通ってるかではなく、lib フォルダが

直下にあることが重要みたいです。それを裏付けるために

試してみました、パスを通しただけではダメでしたね。

 Windows 版 X11-BASIC を Windows の制御下で利用できる日

本語コードは SHIFT-JIS です。これは xbasic.exe を実行し

てのコンソールを表示するとおかしいと思うでしょう。コ

ンソールのメッセージの文字が化けるんです。

 けれど SHIFT-JIS & CR+LF コードで書いたソースファイ

ルを load して run すると日本語が表示されます。同じコー

ドを xbasic.exe と同じディレクトリに置いてコマンドプロ

ンプトで

xbasic [ソースコード名].bas

で実行するとやはり日本語が表示できるます。これは

X11-BASIC コンソールやコマンドプロンプトが Windows の制

御下にあるからそうなるんです。

(14)

 これは X11-BASIC を Unicode(UTF-8)を表示させるターミ

ナルで使うことをはじめから意図してるようです。試しに

Cygwin をインストールしてる WindowsPC で、TeraTerm に付

属してくる Cygterm で UTF-8 & LF コードと指定して

xbasic.exe を起動すると、化けずにメッセージが表示され

るんです。

 色々と思惑があるんでしょうな。GNU 関係のプロジェクト

同志とか、世の中は Unicode が標準だからいいかげん移行

しろよとか。なんでこんなややこしいことをしたんだろう

と思います。私が見落としてるのかもしれませんが公式な

説明は見当たりません。こういう「わかってるでしょ?」

みたいな姿勢を変えないことにはユーザはつかないですよ

ね。現に日本人ユーザってホント見かけませんし。

(15)

MacOSX にて…

 MacOSX には、OSX ver2.0 の頃から X11 環境がインストー

ルできるようになりました。このおかげで、UNIX で作られ

た X11 アプリケーションをソースから MacOSX でコンパイル

すれば、MacOSX でも使える恩恵に授かりました。

 今の MacOSX ではいったいどうなってるかわからないんで

すが、私の持ってる MacOS10.6.8 SnowLeopard では、OS の

DVD-ROM の中にオプションとして、Xcode や X11 環境を含む

その他設定が用意されていて、OS とは別に任意でインス

トールを行うようになっています。

(16)

 結論を述べますと、私の環境では X11-BASIC のインス

トールは上手く生きませんでした。ちなみに、X Window

System は、XQuartz 2.3.6。gcc は

i686-apple-darwin10-gcc-4.2.1 です。この試行をするため

だけに Xcode をインストールしたので DVD からインストー

ルした状態からアップデートはしてません。そういう

ニュースはないので OSX の X11 や gcc の初期不具合とかでは

なさそうです。

 ./configure

は、うまくいったのですが、make で

 ld: symbol(s) not found

 collect2: ld returned 1 exit status  make: *** [xbasic] Error 1

で異常終了してしまいました。リンク関係すか・・・。

 わたくしの修行が足りないもありまして、原因究明には

いたらず。つまりその調べるのもめんどくさくてですね。

Linux でも Windows でも Android でも動いている現状では、

わざわざ MacOS で動かしたいとは思わないわけで。

 どうしても、MacOS で動かしたい方は、がんばってくださ

い。おそらくチャレンジしてる人はきっといます。

(17)

よう、世界

 ここでは、Android 版の X11-BASIC のメニューを上から順

番に説明するスタイルをとります。Windows や Linux に

X11-BASIC をインストールした方なら、改めて読むほどの内

容ではないかもしれません。それでも、X11-BASIC を使う上

での約束事もあったりするのでご覧になってください。

 X11-BASIC はスクリプト・インタプリタです。コマンドを

羅列したファイル(プログラム)を実行します。X11-BASIC の

プログラムでは通常、拡張子に「.bas」とか「.xbas」と付

けます。または、一行ずつコマンドを実行させるインタラ

クティブモードで実行することもできます。

 Android でご利用の方は、X11-BASIC アプリのアイコンを

タップすると最初からインタラクティブモードになります。

 Windows や Linux で X11-BASIC インタプリタを開始するに

は、いくらか方法があります。一番簡単な方法は、xbasic

とコマンドを打ち込む方法です。そうするとインタラク

ティブモードでインタプリタを使うことができます。

インタラクティブモード

(18)

************************************* * xbasic V. 1.23 * * by Markus Hoffmann 1997-2015 (c) * * * * lib Sun Dec 7 11:53:25 CET 2014 * ************************************* >

 この「>」印はプロンプトと呼びます。このプロンプトの

後にカーソルがあると思います。

 プロンプト「>」の後ろに入力したコマンドは、エンター

キーを押せばそのまま実行されます。

 キーボード等の入力で

> print "Hello,World"

と入力して改行(Enter)してください。すると、

> print "Hello,World" Hello,World >

(19)

と表示されてると思います。

 入力したコマンド文字列はメモリにバッファされるので、

上下キーを押して過去に入力した履歴を遡ることができま

す。

 このようにコンソール画面に直接コマンドを入力してコ

ンピュータから返事を得る方法を、X11-BASIC ではインタラ

クティブモードと呼びます。いにしえの旧制 BASIC では、

ダイレクトステートメントと言ってたことができます。ち

なみに、英字は大文字でも小文字でも区別しません。

 それでは次に足し算をします。

> print 1+1 2

となったと思います。

 print という命令はなんだろうと察するに、コンソールに

結果を出力する命令なんだと推測できると思いますよね。

プログラムはこういう命令を書いたコードをコンピュータ

に順番に実行させることです。

 ここでコードを記述するために、いったん X11-BASIC を

終了させます。X11-BASIC を終了するには、右上のメニュー

から「Quit」を選ぶか、先ほどのプロンプトに「> quit」

(20)

と入力して改行(Enter)するか、またはキーボード付きの端

末なら Ctrl-C を押せば終了します。

プログラミング

 さて、プログラミングする前にやることがあります。な

んでもいいのでエディタアプリをインストールしてくださ

い。Android でもプログラムを書くにはエディタを使ったほ

うが楽です。私は「920 Text Editor」(有償版)と

「Jota+」(フリー/有償版)を使わせていただいております。

「Jota+」は BASIC のコマンドの強調表示に対応してるので

結構良いです。有償版にアップグレードするかは、あなた

のお好みで。

 Android 版 X11-BASIC ではプログラムを Load しようとす

ると、ローカルディスクの下にある BAS ディレクトリを開

きます。パスで表記すると私の Android 端末では、

/mnt/sdcard/bas になります。おそらく Android OS のセ

キュリティの制約によるアプリの決め事なんだと思います。

 ファイルはその下にある拡張子.bas ファイルを選択する

ことになります。そのため自分で新たにプログラムを書く

場合は、直接 BAS ディレクトリ以下に作成するか、他の

ディレクトリから X11-BASIC ソースファイルをコピーして

くることになります。私は他のディレクトリ(例えば work

とか作成して)にソースを作成して、./BAS にコピーするこ

とにしてます。その方がバックアップになりますしね。

(21)

 まずは慣例に倣い"Hello, World"を表示させます。

 簡単に言えば、

(1)「print」という命令を使って"Hello,World"という文字

を表示させる。

(2)最後に「End」と書く。

の二点です。

 ではエディタを開いて

print "Hello, World" end

と書き込んでください。半角英文字なら大文字でも小文字

でもいいです。

 プログラムを書いたら保存しましょう。とりあえずお好

きなフォルダに保存してください。ファイル名は好きな名

前でいいです。Android OS のファイルシステムが全角日本

語をサポートしてるのでファイル名が漢字でもカタカナで

も読むことはできます。けど X11-BASIC が全角文字の入出

力は対応してませんので英字にしとくのが無難だと思いま

す。

 拡張子は「.bas」としてください。

 ファイル名に悩むなら日付で作ってみてください。2014

年 09 月 20 日なら「20150220.bas」みたいな感じで。題名

が思いつかなくても、いつ作ったのかわかるので悩んだと

きは良いです。

(22)

 所望のディレクトリにプログラムを保存したら、その

ファイルを./BAS へコピーします。

 では X11-BASIC を起動させてください。

************************************* * xbasic V. 1.23 * * by Markus Hoffmann 1997-2015 (c) * * * * lib Sun Dec 7 11:53:25 CET 2014 * ************************************* >

LOAD

 右上のメニューから「Load」を選んでコピーしたファイ

ルを選択してください。

 またはダイレクト・ステートメントで

> load "ファイル名.bas"

で LOAD することができます。ここでフィアル名に全角文字

を使っていると、Android 版 X11-BASIC ではコンソールに文

字を入力できないわけです。

LIST

 プロンプトに

> list

と入れて Enter してください。

(23)

 すると先ほどエディタで作成したコードが表示されると

思います。

RUN

 右上のメニューから「Run」を選んでください。またはプ

ロンプトの後に

> run

と入れて Enter してください。

 すると

> run Hello,World

と出力されると思います。

NEW

 NEW というコマンドは、読み込んだ X11-BASIC プログラム

をクリアする命令です。

 右上のメニューから「New」を選んでください。または

> new

と入力します。その後に、

> list

(24)

と入力してもリストが表示されないことがわかります。

 またプログラムを読み込みたいなら再度「Load」すれば

いいです。

QUIT

 最後は QUIT で X11-BASIC を終了します。

 Android の場合は、QUIT コマンドの使い方に注意してく

ださい。QUIT は本当に X11-BASIC というアプリを終了する

コマンドです。プログラム終了即ちアプリの終了というの

なら構わないんですが、計算結果を出力するプログラムだ

とアウトプットを読むことができなくなります。この場合

は、STOP や END を有効に使ってください。

 ここまでの一連の操作の流れです

(Result) > load "test.bas" > list

print "Hello, World" end > run Hello, World > new > list > quit

 最初のプログラムとして、まずは以上でございます。

(25)

文法と構文の基礎

プログラミングとは

 「コンピュータ、ソフトなければただの箱」とは聞き古

した格言ですが、実際コンピュータを動かす際には、ソフ

トウェアが必要不可欠になってきます。このソフトウェア

によって、ワープロ、ゲーム、インターネットなど、私た

ちはコンピュータを様々な形で使うことができるのです。

 「じゃぁ、ソフトウェアはどうやって作ってるの?」

 それは、プログラミングによって作られます。ソフト

ウェアを正しく動かすには、その手順書、プログラムを作

る必要があります。その作業をプログラミングといいます。

 これから、X11-BASIC でのプログラミングを色々書いてい

きます。まずはどんな入門書にも書かれているようなその

言語の生い立ちでも書いておきます。別に読み飛ばしても

困る話ではないのですが、なんというかこれから使い方を

思える言語への愛着というか、親しみというか持っている

といないのでは継続に違いはあると思うんですよね。意気

込みっていうんですか?そういうのを感じていただければ

いいと思います。

BASIC の生い立ち

 BASIC は、1964 年ころにダートマス大学の J.G.ケメニー

と T.E.カーツによって開発された教育用プログラミング言

語です。当時、主流だった FORTRAN を手本としながらも、

(26)

FORTRAN の使いにくいところを初学者向きに改めて作成され

た言語です。 ケメニーとカーツの BASIC は、現在、True

BASIC と呼ばれ、Windows、Mac、UNIX などに対応したバー

ジョンがあります。

マイコン用 BASIC

 現在、多くの人が BASIC だと思って使っている言語は、

本来の BASIC とは異なるものです。NEC の N88-BASIC や富士

通の F-BASIC、シャープの Hu-BASIC などです。これらの言

語は、見かけはよく似ていますが、根幹となる部分で本来

の BASIC と相違する点があります。

 これらの言語は、マイコン用に改変された文法を継承し

ています。初期のマイクロコンピュータは現在の PC とは異

なり、メモリをふんだんに使うことはできませんでした。

いかにして限られた容量の ROM のなかに BASIC 処理系を詰

め込むかが勝負となったのでした。そのために採用された

手法の 1 つがインタプリタです。インタプリタは、書かれ

たコードを一行ずつ順番にマシン語に変換し実行します。

そのためプログラム全体としての実行は遅いです。その代

わり、一行に print 1+1 と入力して Enter すればすぐに 2 と

返答するようなダイレクトステートメントのような使い方

ができて電卓くらいの意識で気軽に使えたわけです。

 ちなみにこれが Microsoft の Quick BASIC みたいな構造

化 BASIC になりますと話は変わります。それまでは1行1

(27)

行機械語に翻訳してたわけですが、構造化 BASIC の仕様上

プログラムリストを読み込んで構造を分析しなければなら

なくなりました。その段階でダイレクトステートメントと

いう小技は使えなくなりました。じゃあ代わりに、という

わけでしょうか、構造分析する手間があるんだったら文法

のミスとかエラーも添削しましょうというわけになりまし

た。そういういきさつが現在の一般的な IDE の親切機能に

反映されてるわけですね。

BASIC 言語の標準化

 マイコン時代に各社各様の BASIC が乱発されたことによ

り、BASIC の仕様に危機が訪れます。そこで BASIC の標準化

をしようという活動が始まりました。BASIC の標準化のため

の作業は 1974 年に始まり、4 年後の 1978 年に米国および欧

州で Minimal BASIC(最小 BASIC)として規格化されました。

1982 年には国際標準化機構(ISO)原案が作成され、1984 年

には Minimal BASIC の国際規格が制定されました。日本で

は、ISO 規格案に基づいて、1982 年に「基本 BASIC」という

名称で Minimal BASIC が規格化されました。

 Minimal BASIC の規格化に引き続いて、BASIC の完全バー

ジョン(Full BASIC)の規格化作業が開始されたのですが、

その作業はかなり難航したようです。1982 年に原案が作成

され、1986 年に欧州、1987 年に米国で規格として成立しま

した。国際標準化機構(ISO)は、1991 年に欧州規格と米国規

(28)

格を包含する形で Full BASIC の ISO 規格を制定しました。

日本では、ISO 準拠の形で 1993 年に Full BASIC の JIS が制

定されました。

 1989 年、米国でモジュールおよび単文字入力に関する追

加の規定が規格化されました。これは、JIS では参考として

収録されています。

問題解決指向

 現在、広く用いられているプログラム言語のほとんどは、

プログラムを書く人自身の問題を解決するために書かれる

のではなく、他の誰かがユーザとして使うことを考えて作

り始めるのが普通です。プログラミングという体験に向か

う姿勢に違いがあるということがわかると思います。

 しかし、本来の BASIC は、問題解決指向です。プログラ

ムを書くのは、他者に使わせるためではなく、プログラム

を作成する人自身の問題を解決するためです。他者に使わ

せるプログラムでは入力をわかりやすくするための装飾的

部分が重要になりますが、自分で使うプログラムでは装飾

的な部分や説明的な部分に手間をかけたいとは思いません。

 Full BASIC はコンピュータの専門家でない人が問題を解

決するツールとして使うのを考えています。Visual Basic

は、割と他の人が使うことを想定して作るもんです。じゃ、

X11-BASIC は?ということになりますが、これは割とバラン

スのとれてる仕組みでどうとでも作ることができる気がし

(29)

ます。GUI 風に部品を綺麗に配置することも、または武骨に

ターミナル上でコマンドラインで使うこともできます。ま

あ、Visual Basic が GUI ベースの Windows を普及させるた

めの先人になってしばらく、だいぶこなれてきたというこ

とでしょう。

 なんにしても、プログラミングという作業はお給料をも

らったり、クライアントさまのことを考えながら作るもの

だという思い込みは捨ててしまってかまいません。プログ

ラミングは日々の日記をブログに載せたり、チラシの裏に

描いた絵をスキャンして投稿したり、YouTube に動画を投稿

したりと同じく個人的体験だという。そこがポイントです。

BASIC バッシング

 おおむね好意的に受け入れられてきた BASIC ですが、コ

ンピューターの世界には反対意見も存在していました。特

に目立って論陣を張っていたのが、オランダのコンピュー

ター科学者であるエドガー・ダイクストラ教授でした。

2002 年に亡くなったダイクストラ教授は BASIC に関して

「BASIC に一度でも触れたことがあるものに対して良いプロ

グラミングを教えることは事実上不可能である」と発言す

るなど、強硬な反 BASIC 論者として知られていました。

 実際には、PL/I は「致命的疾病」、FORTRAN につい COBOL

に至っては「犯罪行為」とまで批判していたために BASIC

のみを標的にしていたものではなかったのです。まあ、批

(30)

判屋稼業というのはいつの時代もどんなところにもいるっ

てことでしょうか。ネガティブで不安を煽るニュースの方

が記憶にはよく残るもので、そういうわけで何かと BASIC

というと「ちょろい言語」という先入観を持たれるように

なりました。

 しかし、現在でも Microsoft 謹製の他にもいろいろな

BASIC が生き残ってることを考えるとそうした印象が的はず

れだったとわかると思います。なぜでしょう。理由があり

ます。そもそも BASIC が初学者のプログラミングスキル習

得を目的としたプログラミング言語だからです。そこをよ

く誤解しますよね。新しいプラットホームができて、そこ

でプログラミングしてみようとする人が現れる限り、そこ

に BASIC があるわけなんです。

(31)

コンソールへの出力

Print 文

 Print は、コンピュータに出力をさせるための命令です。

Print 文を利用して文字列を表示することができます。文字

列は、その前後を引用符(")で囲んで表します。

 基本的に、プログラムは上から下に読まれます。命令は

こんな風に、複数行にわたって書くこともできます。

 まずは X11-BASIC を起動してプログラムリストを Load し

て実行する方法で実行してみます。

holy@901:~$ xbasic ********************************************************** * xbasic V. 1.23 * * by Markus Hoffmann 1997-2014 (c) * * * * version date: Mon Aug 4 21:15:31 CEST 2014 * * library V.1.23 date: Mon Aug 4 21:13:35 CEST 2014 * ********************************************************** > load "test.bas"

> list

Print "Hello, World" Print

Print "I am X11-BASIC" End

> run

Hello, World I am X11-BASIC

(32)

>

 Print の隣に何も記述しないで、ただ Print とだけ書くと

空白行が出力されます。

 Print の隣に式を直接書くと、コンピュータに計算させる

ことができます。

 今度はターミナル上で実行させてみましょう。コードの

先頭に「#! パス名」と終わりに Quit 文が入ってるのがポ

イントです。Quit 文により、処理が終了したら X11-BASIC

インタプリタも終了するようにしています。Andoroid を試

用されてる方は、Quit 文は外したほうがいいでしょう。い

ちいちアプリが閉じてしまいますから。

holy@901:~$ ls -l test.bas

-rw-rw-r-- 1 holy holy 35 3 月 4 21:40 test.bas holy@901:~$ chmod +x test.bas

holy@901:~$ ls -l test.bas

-rwxrwxr-x 1 holy holy 35 3 月 4 21:40 test.bas holy@901:~$ cat test.bas

#! /usr/bin/xbasic Print 1+3 Quit End holy@holy-901:~$ ./test.bas 4

 代数を使うこともできます。

(33)

 仮に a を底辺、b を高さとしたら、出力される結果は三角

形の面積ということになります。

 すでに実行権を付加してる test.bas を編集して使いまわ

します。Android を使ってる人は、メニューから Edit を選

択してコードを書き換えてみてください。書き換えたら保

存して、再ロードしてください。

holy@901:~$ cat test.bas #! /usr/bin/xbasic a = 3 b = 4 Print (a * b) / 2 Quit End holy@901:~$ ./test.bas 6

 Print 文では計算結果を出力するときにその様式を制御す

ることができます。そのうち、特に重要なものを説明しま

す。

 Print 文には、コンマまたはセミコロンで区切って複数の

項目を書くことができます。

 項目の区切り記号にセミコロンを用いると、各項目は詰

めて表示されます。項目の区切りにコンマを用いると、各

項目は一定の桁位置まで空白を出力した後に出力されます。

 たとえば、

(34)

(X11-BASIC) Print 1;2;3,4 End (Result) 123 4

 通常、Print 文を実行すると、最後に改行します。改行し

たくない場合には、Print 文の末尾にコンマかセミコロンを

書いておきます。

 たとえば、

(X11-BASIC) Print 1;2; Print 3;4 End (Result) 1234

のように出力されます。

コンソールからの入力

Input 文

 プログラムの実行時に変数に値を代入したいときには

Input 文を用います。Input 文では、Input に続けて数値を

代入したい変数をコンマで区切って並べます。

(35)

 次のプログラムは、入力された 2 数の平均を表示します。

 例ではセミコロンを末尾につけた Print 文を直前に入れ

ることで、何を入力するのか表す小技を使っています。

(X11-BASIC) Input " a= ? "; a Input " b= ? "; b Print (a + b) / 2 End (Result) a= ? 35 b= ? 66 50.5

(36)

命題

数値

 加減乗除の演算を、それぞれ、+、−、*、/で表します。

また、ベき乗の演算は、^という記号を用いて、たとえば、

2 3 を 2^3 のように表します。

 異なる演算記号を含む式を書くと、最初にべき乗を実行

し、次に乗除算を実行して、最後に加減算を実行します。

同順位の演算は左から実行します。

 計算を実行してその結果を表示させるのに Print 文を用

います。

(X11-BASIC) Print 2+3*4^2 Print 3/4*5 Print (2^4)^5 End (Result) 50 3.75 1048576

1 行目は 2+3×4^2 を計算します。

2 行目は 3÷4×5 を計算します(3/(4×5)ではありません)。

3 行目は (2^4)^5 を計算します。ここで、ちゃんと( )で

囲まないと

(37)

Print 2^4^5 1048576

となります。

 X11-BASIC は、-2147483648 から 2147483647 までの 32

ビット整数を使います。浮動小数点は 64 ビット IEEE754 標

準にしたがいます。それらは、52 ビットの仮数(常用対数小

数部)と 11 ビットの指数と符号ビットを持っています。そ

れらは 16 桁目を+ー符号として使って 1e-308 から 1e+308

の値に置き換えられます。乗数でも+ーの符号を使った表

現ができます。

253 67.3 0.25 -127.42E-3 -1.3E7 1

 10 進数整数を 16 進数や 2 進数表記に置き換えることがで

きます。16 進数は$(または 0x)と表現されます。2 進数表記

では%を用います。

%101010 -$FFE0 0xA0127BD -%10001001 %00011010

算術関数

 X11-BASIC は基本的な算術関係の関数を取り扱っています。

三角関数:SIN()とか ATAN() 対数:LOG() ビット演算:AND とか OR

(38)

最大最小:MIN()と MAX() 余りとか整数:MOD とか INT()

演算子

 数値演算子はおおよそ、以下のような分類で分類されて

います。

算術演算子(arithmetical operators): ^ * / + -比較演算子(comparison operators): = <> < > <= >= 論理演算子(logical operators): NOT AND OR XOR ...

 X11-BASIC の演算では、次のような優先順位で認識します。

優先度 演算子 1 ( ) parenthetical expression 2 ^ exponent/power 3 sign (negation) 3 + sign

4 NOT bitwise not 5 = divide

5 * multiply

5 " integer division

5 MOD modulus (rest of division) 6 + add

6 - subtract

7 << bitwise shift to the left 7 >> bitwise shift to the right 8 = logical "equals"

(39)

8 <> logical "not equal" 8 < logical "less than" 8 > logical "greater than"

8 <= logical "less than or equal" 8 >= logical "greater than or equal" 9 AND bitwise and

9 OR bitwise or 9 XOR bitwise xor 9 IMP implies 9 EQV equivalence 10 = assignment

変数

 X11-BASIC での変数は、動的型付けでグローバルです。

 どういうことかと言いますと、まず変数を使用するのに

どんな型の変数を使うのか宣言する必要がありません。

X11-BASIC のほうで勝手に判断してくれます。

 またどこから変数を使い始めても、その変数はプログラ

ム内ならどこでも使えます。プロシージャや関数ないでも

それが通用します。

 具体的な例を示します。

(X11-BASIC) A = 1 Print A @Flip() @Flop()

(40)

End Procedure Flip() A = A + 1 Print A Return Procedure Flop() A = A - 1 Print A Return (Result) 1 2 1

となりますし、あえてプロシージャや関数でのみ使いたい、

使い捨ての変数なら

(X11-BASIC) A = 1 Print A @Flip() @Flop() End Procedure Flip() Local A A = A + 1

(41)

Print A Return Procedure Flop() Local A A = A - 1 Print A Return (Result) 1 2 0

となります。

 X11-BASIC は二つのスコープを使います。すなわち

Global か Local かです。Global がデフォルトとなります。

Global 変数は、プログラム内ならどこでも使えます。Local

と宣言しない限り、X11-BASIC の変数はデフォルトで

Global 変数です。しかしグローバル変数を多用することで

プログラムコードの可読性や理解が低下するという弊害も

あります。とはいえコードのどんな場所でも変数の値を変

えたいときに変えることができるというのもいいことです

よ。Global 変数は他の Local スコープの変数と名前がかち

合う恐れが多々あります。

 そういうわけで X11-BASIC も、注意を払う必要のあるプ

ロシージャや関数で使えるように Local 変数を供します。

(42)

もし同じ名称の Global 変数があったとしても、Local に使

われてる変数とは別物と扱われます。

命名

 変数の名前を命名するのに文字と数字を使うことができ

ます。変数名の中にスペースを入れることはできません。

そういうときはアンダースコアで代用してください。変数

名は複数文字を使ってある程度長くてもいいです。変数名

の最初の文字に数字やアンダースコアを使うことはできま

せん。X11-BASIC の命令に似た変数名にはしないでください。

トラブルの元になります。例えば、TRUE, FALSE, TIMER,

PC, TERMINALNAME$とかいうのも避けるべきでしょう。

 確かに変数の命名はユーザに任せてます、しかし既に内

部変数として使われてる名前は使えません。それと次のよ

うな名前もつけるべきではありません。

x, auto%, lives%, bonus1%, x`1, city`name$

 次のような変数にも X11-BASIC は警告を出します。

`blank, 1x, ?value%, 5s$.

(43)

 変数名がコマンド名とか他の型の変数や配列名と区別の

つきにくい名前もよくありません。例えば、A$という文字

列変数があるとすれば、A とか A(1,1)とか A$(1,1)見分けが

つきにくいと思います。

 コマンド間のスペースは無視されます。しかし、とりわ

け括弧の前後、ASC("A")とするのを ASC( "A" )とか ASC

("A")とかするのはダメです。

(例) 整数型: i%=25 my`adr%=VARPTR(b$) b%=MALLOC(100000) 実数(浮動小数点)型: a=1.2443e17 b=@f(x) 文字列型: t$="Hello everybody !" 配列: i%(),a(),t$(), [1,3,5;7,6,2]

(44)

変数の型

 変数に入ってる中身がなんなのかどうすれば知ることが

できるでしょう。X11-BASIC では、変数名そのものが変数の

型式を語ります。

 X11-BASIC は特殊な印をつけることでデータ型を見分けま

す。X11-BASIC は、浮動小数点や整数、文字列や配列も扱え

るインタプリタです。配列の宣言には DIM 命令を使うもの

の、変数の型の宣言は必要ありません。X11-BASIC インタプ

リタは、変数名文字列の末尾で変数の型を認識するからで

す。

 整数は「変数名%」、文字列は「変数名$」、配列は「変

数名()」。末尾にこれらの識別記号のない変数は実数

(Float)として扱われます。整数のポインタや関数の呼び出

しには文字列の先頭に「@」が使われます。それと論理型は、

整数と同じ記号が使われます。

 注意していただきたいのは、個々の変数の用途や区別は、

名付け親であるあなたの命名センスを以って実現できてる

ことです。変数名の名付けで不精しないようにしてくださ

い。

(例) x=10.3 : 64bit 浮動小数点実数型 x$="Hello" : 文字列型 x%=5 : 32bit 整数型 @x : 関数プロシージャのコール

(45)

x()=[1,2,3,4] : 配列参照

 値を計算するためには式が必要です。最も単純な式は、

数値または文字列定数です。定数、変数、演算子、関数呼

び出しを使うともっと複雑な式になります。X11-BASIC の式

の表現形式は、他の多くの BASIC と同じです。演算子には

通常の優先順位があり、括弧を使用して演算の順序を変更

することができます。

PRINT (x-1)*10+SIN(x)

 X11-BASIC では条件と式が同等に扱われます。X11-BASIC

はブール演算の条件と式を区別する術を持たないため、演

算演算(AND、OR、XOR、NOT)はバイナリ値で操作します。し

たがって、TRUE が-1 であるとすれば、全てのビットにおい

てそうなります。オペレータはそうビット操作をすること

になるでしょう。式が FALSE でない限り状態は TRUE と考え

られます。この場合、FALSE は必然的に 0 以外の数となる。

TRUE はすべてのビットが 1 であることを意味し-1 です。そ

こでオペレータは、これらの各ビットで動作します。この

ような条件式が FALSE でない場合は TRUE とみなされます。

(結果がゼロ以外の値でなければならないことを意味しま

す)

(46)

代入文

 変数に数値を記憶させることを代入といいます。変数に

新たな数値を代入すると、それ以前に保持していた数値は

消滅して参照できなくなります。

 変数に数値を代入するのに数値式を用いると、右辺の値

が計算されて左辺の変数名が示す変数に代入されます。

文字列

 文字列変数は、任意の長さのキャラクター(バイト)です。

仮想メモリが許す限りの長さを得ます。文字列は一般に

ASCII テキストで、必要ならば任意の長さのバイトコードも

保持することもできます。X11-BASIC は必要に応じて自動的

に解釈します。もしバイトコードを X11-BASIC が文字列と

判断すれば、長さ等も変わり、メモリ上の位置は変わるこ

とでしょう。文字列変数は「$」と決められています。文字

列定数は「" "」で囲みます。文字列に特殊文字を連結す

ることもできます。通常、文字列をサブストリングに分け

といて、実行するとキャラクタコードの断片を「+」で連

結するという手を使います。

st$="This is a special string, containing a bell character at the end"+chr$(7)

(47)

 ちなみに、ダブルクォーテーション文字は chr$(34)で表

現できます。

配列

 DIM 命令によって配列を宣言します。

 配列はいくつもの型の変数を同時にメモリ上に保持しま

す。通常の変数は一度に一つだけの値を持ってますが、配

列は数個の値を持つことができます。変数にインデックス

と言う添字をつけることでそれぞれの値と対応付けます。

インデックスは「(」と「)」に囲まれた数値です。イン

デックスの数値に制限はありません。配列の次元にも制限

はありません。ただしインデックスと次元は、正の整数値

でかつメモリが許すだけになります。X11-BASIC の配列は、

文字列形式も含む任意のデータ型です。X11-BASIC 基本の特

殊な機能としては、配列の暗黙的な定義と配列定数の存在

です。

Dim b(10) a()=b()

 ここで、b()は事前に DIM 命令で定義されているものとし

ます。

a()=[1,2,3,4;6,7,8,9]

(48)

 配列定数を割り当てます(この例では、2 次元配列が作成

され、行がセミコロン「;」で分離されています)。

書式指定

Print <expression> Using"<format string>"

 Print 文に書式指定を追加するときは、Print 文の後に

Using 書いて" "で囲まれた内部に節を書きます。

Print 数値式 Using "書式指定文字列"[,数値式 using "書式指定文字列"])

です。書式を作成するとき、整数部の桁数が不足しないよ

うに注意してください。特に、負数の場合、負号を出力す

る分の桁の確保を忘れないように。書式を指定すると、小

数部は指定された桁数に合わせて四捨五入されます。

数値の表現

 数値表現の書式の詳細は次のようになります。

+ 数値の符号を書きます(任意)。 - 負である場合のみ数値の符号を書きます(任意)。 # 十進数の数値の桁数を指定します。指定された桁数より小さい場合は、 右詰めになります。 0 必要ならば(任意)。

(49)

. 小数点の位置を表します。 , 1000区切りで「、」を挿入します。 ^ 10の乗数を書きます。 例1 Print Pi Using "-#.###" 3.142 Print Pi Using "+0#.###0" +03.1420 Print -11^11 Using "##.##^^^^" -2.85e+11 例 2 (X11-BASIC) For i = 0 To 17 n = 10 ^ i Print n Using "####################.##############", (1 + 1 / n) ^ n Next i End (Result) 1.00000000000000 2 10.00000000000000 2.5937424601 100.00000000000000 2.704813829422 1000.00000000000000 2.716923932236 10000.00000000000000 2.718145926825 100000.00000000000000 2.718268237192 1000000.00000000000000 2.718280469096

(50)

10000000.00000000000000 2.718281694133 100000000.00000000000000 2.718281798339 1000000000.00000000000000 2.718282051996 10000000000.00000000000000 2.718282052691 100000000000.00000000000000 2.71828205298 1000000000000.00000000000000 2.71852349587 10000000000000.00000000000000 2.716110033705 100000000000000.00000000000000 2.716110033666 1000000000000000.00000000000000 3.035035206235 10000000000000000.00000000000000 1 100000000000000000.00000000000000 1 例 3 (X11-BASIC) For x = 3.14159265 To 3.14159266 Step 0.000000001

Print x Using "#.#########", Sin(x) Using "-#.###############" Next x End (Result) 3.141592650 0.000000003589793 3.141592651 0.000000002589793 3.141592652 0.000000001589793 3.141592653 0.000000000589793 3.141592654 -0.000000000410207 3.141592655 -0.000000001410207 3.141592656 -0.000000002410208 3.141592657 -0.000000003410208 3.141592658 -0.000000004410208 3.141592659 -0.000000005410208

(51)

例 4

(X11-BASIC) ' case-a

a = Sqr(2)

Print " Plain Output"

Print " Print Sqr(2) = "; a Print a Using "##.#####" Print a Using "##.####" Print a Using "##.###" Print a Using "##.##" Print ' case-b b = 0.00001

Print " Plain Output"

Print " Print 0.00001 @ ###.### = "; b Print b Using "###.###" Print b Using "+0###.###0" Print b Using "###.###^^^^" Print ' case-c c = 10000.0

Print " Plain Output"

Print " Print 10000.0 @ ###.### = "; c Print c Using "###.###" Print c Using "+0###.###0" Print c Using "###.###^^^^" Print ' case-a,b,c Print a, b, c

Print a Using "###.###", b Using "###.###^^^^", c Using "#.###^^^^"

(52)

End (Result) Plain Output Print Sqr(2) = 1.414213562373 1.41421 1.4142 1.414 1.41 Plain Output Print 0.00001 @ ###.### = 1e-05 0.000 +0 0.0000 <= 小数点の位置を基準にそろえる 1.000e-05 Plain Output Print 10000.0 @ ###.### = 10000 ******* <=桁が足りないので表示できない ********** <=桁が足りないので表示できない 1.000e+04 1.414213562373 1e-05 10000 1.414 1.000e-05 1.000e+04

プロシージャと関数

 X11-BASIC は構造化された手続き型プログラミング言語で

す。それぞれが単一のユニットのように動作する複数のセ

(53)

クションで、プログラムは構成される、いわばカプセル化

された構造形態を持ちます。ブロックの始めと終わりは、

明示的なキーワードによって区切られます。

 伝統的 BASIC の実装とは違い、X11-BASIC で行番号は使用

されません。一行はすべて何かしらの命令を持ちます。

Goto でのジャンプも可能ですが、そこはループと中止コマ

ンド(Exit If や Break)をご利用していただきたい。

 任意の型の戻り値を持つプロシージャと関数は再利用可

能です。これによりプログラムをモジュール単位で構造化

できます。プログラムは、プロシージャや関数をコールす

るメインとなる部分を持ちます。その他のライブラリを

マージコマンドで追加することもできます。

1.プロシージャと関数

 X11-BASIC には、プロシージャと関数の 2 つサブルーチン

の種類があります。この違いは、プロシージャは値を返さ

ず、関数は単一の値を返す点です。プロシージャや関数は、

メインブロックの後に書かれなければなりません。した

がって一般的な X11-BASIC プログラムの次の構造になりま

す。

Main program block :

(54)

Procedures and Functions :

 プロシージャは、プログラムのどこからでも呼び出すこ

とができるブロックです。これらのサブルーチンは引数を

取ることができます。しかしプロシージャ内で処理された

結果を返すことはしません。それらは、プロシージャロー

カルの変数だけでなく、すべての変数に言えます。

 関数は他の式から呼び出すことができるブロックです。

例えば、A = 3 * @MyFunction(b)とか指定することができ

ます。関数の中での変数は、Local 宣言しない限り変数は

Global です。同じ名前を持つ、Local 変数の関数外での変

更は、明示的に関数内で指定しない限り関数内の値を保持

しません。関数の引数は、任意のデータ型の変数や配列に

なります。関数は、任意のデータ型の変数を返すことがで

きます。デフォルトでは、引数は値渡し(ByVal)で渡されま

す。

 次のは、割と関数を使う典型的な例です。

(X11-BASIC) 'Main x = 0.0 y = 0.0 z = 0.0 For i = 1 To 100 x = x + 1.0

(55)

For j = 1 To 100 y = y + 1.0 z = @Equation(x, y) Print " x="; x; " y="; y; " z="; z Next j y = 0.0 Next i Quit End Function Equation(X, Y) Equation = (X + Y) / 2.0 Return Equation End Function

2.プロシージャ

 プロシージャは、キーワード Procedure に続く”プロ

シージャ名”で始まり、引数(parameters)はプロシージャ

に渡されます。すべてのプロシージャの終わりは、RETURN

で終了します。プロシージャの形式はだいたい次の形式に

なります。

Procedure ProcName(parameters) Local vars    : Procedure logic    : Return

(56)

 サブルーチンの変数は、サブルーチン名の後ろの括弧の

間に配置され、メインプログラムでプロシージャを呼び出

した変数の配置と同じ順序でなければなりません。サブ

ルーチン内で使用されるすべての変数は、Local ステートメ

ントを使用して、ローカルに宣言する必要があります。

 プロシージャは次の 2 つの方法で呼び出すことができま

す。Gosub または@を使用します。次の例、テキストコン

ソール上の進行状況バーを示す progress()プロシージャで

は、次の方法で呼び出し、総量 a と区分 b の変数が引き渡

されます。

Gosub progress(100,i) @progress(100,i) Procedure progress(a,b) Local t$ If verbose Print Chr$(13);"[";string$(b/a*32,"-");">"; Print String$((1.03-b/a)*32,"-");"_ ";str$ (int(b/a*100),3,3);"% ]"; Flush Endif Return

3.関数

 関数は、関数名に続く Function ヘッダーで始まり、キー

ワード Endfunction で終了します。関数は、数値や文字列

(57)

の関数いずれかです。デフォルトでは数値関数です。文字

列関数は文字列を返し、「関数名$」で定義されます。関数

は、少なくとも 1 つの関数の値を返すための Return 文が必

要です。だいたい次のような形式で使用します。

Function FuncName[$](parameters) Local vars    : function logic    : Return value[$] Endfunction

 戻り値の型は、関数の型と一致する必要があります。文

字列関数は文字列を返しますし、数値関数は数値を返しま

す。数値はデフォルトでは実数として扱われます。Return

文が実行されると関数は呼び出し元に戻ります。E

ndfuncction 文は、関数の終わりを意味し、プログラムがこ

の文だけを実行しようとするとエラーになります。関数は

「@関数名」で呼び出されます。例として、文字列関数の

Copy$()を呼び出す例を示します。

Right$ = @Copy$("X11-Basic", 4)

 ここで呼び出される Copy$()という関数が次の様になりま

す。

(58)

Function Copy$(a$, p) Local b$ b$ = Mid$(a$, p) Return b$ Endfunction

 次の様に書くこともできます。

Function Copy$(a$, p) Return Mid$(a$, p) Endfunction (X11-BASIC) 'Main A = 1 A = @Test(A) Print " A = "; A Quit End Function Test(B) B = 12 ' ... B = 123 Return B End (Result) A = 123

(59)

 関数 Function の置き換え命令として Deffn 文があります。

これは関数式を一行で記述する命令です。上の例で使用し

た Copy$()関数は、Deffn 文では次の様に表すことができま

す。

Deffn Copy$(a$, p) = Mid$(a$, p)

 ローカル変数は使わないものとして、サブプロシージャ

と関数の違いは核心部を Deffn で置き換えれるかどうかの

違いとも言えます。Deffn と Function の違いは、コンパイ

ラは Deffn を一行の表現として扱いシンボル名を要しない

ことです。余計なコードを実行するよりもその方がいくら

か早くなります。

4.パラメータ引数とローカル変数

 X11-BASIC の変数ならどんな型でも、プロシージャや関数

に渡すことができます。デフォルトではすべて値わたし

(ByVal=”by value”)で渡されます。Var 命令によって参照

渡し(ByRef=”by reference”で渡すこともできます。

 Local 命令は、そのプロシージャまたは関数でだけ通用す

る変数を定義します。サブルーチンのパラメータは、ロー

カル変数です。サブルーチンが別のサブルーチンを呼び出

すとき、呼び出しルーチンのローカル変数は、グローバル

変数のように呼び出されたルーチンでは認識されます。

(60)

 Local 命令の後に、カンマで区切って複数のローカル変数

を表記することもできますし、べつに Local 行が複数あっ

てもかまいません。

 注意した方がいい例を次にあげます。X11-BASIC ではサブ

プロシージャでローカル宣言をしてますが、そこで初期値

を何も入れてないためにメインの値がそのまま入っていま

す。GAMBAS で同じコードを書いて実行した例もつけておき

ます。GAMBAS では、サブプロシージャで定義したローカル

変数は宣言と同時に初期化されてます。こういう「仕様」

と言えばそうなんだーと言える細かい意外性があることに

注意が必要ですね。

(X11-BASIC) 'Main a = 1 Print " a@main.before: "; a @Test1() Print " a@main.after: "; a Quit End Procedure Test1() Local a Print " a@sub.before: "; a a = 2 Print " a@sub.after: "; a Return End

(61)

(Result) a@main.before: 1 a@sub.before: 1 a@sub.after: 2 a@main.after: 1 (GAMBAS)

' Gambas module file Public Sub Main() Dim a As Integer a = 1 Print " a@main.before: "; a Test1() Print " a@main.after: "; a Stop End Sub Test1() Dim a As Integer Print " a@sub.before: "; a a = 2 Print " a@sub.after: "; a End (Result) a@main.before: 1 a@sub.before: 0 a@sub.after: 2 a@main.after: 1

(62)

End 文と Quit 文、Stop 文

 X11-BASIC の End 文は、プログラム全体の終了を意味しま

す。プロシージャの終了は Rturn、関数の終了は End

Function で締めくくります。

 Quit 文はすべてのウィンドウを閉じてメモリを開放し、

プログラムを終了させます。

 Android のショートカットで X11-BASIC プログラムを起動

した場合や、Linux/Windows でシェル風に X11-BASIC を起動

した場合、プログラムの実行した終わりに Quit 文があると、

ウィンドウを自動で閉じて終了します。

 どちらのコードでも、終わりに"Quit"があると、人間が

インタプリタを閉じるアクションが必要がなくなります。

 Android 版で注意が必要なのは、Quit は本当にアプリを

終了すことです。そうすると計算されて出てくるはずのア

ウトプットを読むことができなくなります。この点が UNIX

バージョンとは異なります。End を有効に使ってください。

 プログラムの一時中断は Stop 文を使います。Stop 文の箇

所で一旦インタプリタのプロンプトがあらわれます。そこ

から Cont と入力することで、その続きを再開することがで

きます。行がスクロールするのを一旦止めたりするのに使

うとよいと思います。

参照

関連したドキュメント

ところが,ろう教育の大きな目標は,聴覚口話

③ ②で学習した項目を実際のコミュニケーション場面で運用できるようにする練習応用練 習・運用練習」

Pete は 1 年生のうちから既習の日本語は意識して使用するようにしている。しかし、ま だ日本語を学び始めて 2 週目の

具体的には、これまでの日本語教育においては「言語から出発する」アプローチが主流 であったことを指摘し( 2 節) 、それが理論と実践の

注5 各証明書は,日本語又は英語で書かれているものを有効書類とします。それ以外の言語で書

その結果、 「ことばの力」の付く場とは、実は外(日本語教室外)の世界なのではないだろ

 さて,日本語として定着しつつある「ポスト真実」の原語は,英語の 'post- truth' である。この語が英語で市民権を得ることになったのは,2016年

1、研究の目的 本研究の目的は、開発教育の主体形成の理論的構造を明らかにし、今日の日本における