Writer HOLY
2016/06/18
使用雑感
・構造化 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
を使いますが、大きなプログラムを作るためではなくて、
スクリプト感覚で計算させるのに使ったりします。今はス
マフォで 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
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 が存在しています。べつに商標とか本
家本元論とかを話したいわけじゃなくて、名前の勘違いを
しないようにね、ということです。うっかりした勘違いで
回り道をしないように。
それぞれの違いは、こんな感じです。
(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 も相当作り込まれています。
名称は頭文字が 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」には、どうもマニア心を
くすぐるものがあるらしいです。
インストール
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 関係の命令にその一端を垣間見るこ
とができます。
また、MS-DOS の QBASIC(Borland 社対抗の Microsoft
QuickBASIC の簡易版)のプログラマーもほぼコンパチブルで
す。おそらくこっちのほうが馴染みのある人が多いことで
しょう。
UNIX/Linux 版
X11-BASIC のマニュアルやら ReadMe を読むと、
./configure makesudo 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 (中略)
$ 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 系のディストリ
ビューションなら、パッケージインストーラーでインス
トールする手もあります。ただこの場合だと、コマンドラ
インインタプリタを試す分には問題ありませんでしたが、
xbc でコンパイルしようと実行するとリンクエラーが出て上
手くいきませんでした。
X11-BASIC プログラムを、中間バイトコードにコンパイル
することもできます(xbbc)。このバイトコードは、仮想マ
シンによって動作できます(xbvm)。その中間バイトコード
は、環境ネイティブの C 言語でコンパイル可能な C ソース
コードに変換できます(xb2c)。
古の ANSI-Basic プログラム(行番号つき)を、
bas2x11basic を使うことで X11-BASIC コードに変換できま
す。
Android 版
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 のメニューに「どのアプ
リをエディタに使う?」という項目があります。そのほう
が絶対楽です。
Windows 版
適当なフォルダを作成しておきます(例えば「X11BASIC」
とか)。場所は Program Files 以下でも、マイドキュメント
フォルダ以下でも構いません。SaurceForge などから
Windows 用 zip ファイルをダウンロードして解凍します。
WindowsXP 以上ならダブルクリックすれば中身が表示される
と思うので、それらをドラッグして先ほど作っておいた
フォルダに移します。
その中に、xbasic.exe という実行形式ファイルがあるの
で、それをダブルクリックしてください。コマンドプロン
プトみたいな黒いスクリーンが現れると思います。それが
X11-BASIC のコンソールです。閉じるにはウィンドウの
「x」ボタンを押して終了させても構わないんでしょうが、
丁寧に終了するにはプロンプトで「quit」と入力して終了
しましょう。
注意ですが、解答したファイルの中に setup.exe があり、
あたかもこれを実行すればインストールし始めますよ、み
たいな雰囲気をだしてると思います。私の経験ではそれは
実行させないほうが良いですね。確かに実行すると
X11-BASIC をインストールするんですが、X11-BASIC が C ド
ライブの直下に作られたり、拡張子「BAS」とつくファイル
をすべて 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 の制
御下にあるからそうなるんです。
これは X11-BASIC を Unicode(UTF-8)を表示させるターミ
ナルで使うことをはじめから意図してるようです。試しに
Cygwin をインストールしてる WindowsPC で、TeraTerm に付
属してくる Cygterm で UTF-8 & LF コードと指定して
xbasic.exe を起動すると、化けずにメッセージが表示され
るんです。
色々と思惑があるんでしょうな。GNU 関係のプロジェクト
同志とか、世の中は Unicode が標準だからいいかげん移行
しろよとか。なんでこんなややこしいことをしたんだろう
と思います。私が見落としてるのかもしれませんが公式な
説明は見当たりません。こういう「わかってるでしょ?」
みたいな姿勢を変えないことにはユーザはつかないですよ
ね。現に日本人ユーザってホント見かけませんし。
MacOSX にて…
MacOSX には、OSX ver2.0 の頃から X11 環境がインストー
ルできるようになりました。このおかげで、UNIX で作られ
た X11 アプリケーションをソースから MacOSX でコンパイル
すれば、MacOSX でも使える恩恵に授かりました。
今の MacOSX ではいったいどうなってるかわからないんで
すが、私の持ってる MacOS10.6.8 SnowLeopard では、OS の
DVD-ROM の中にオプションとして、Xcode や X11 環境を含む
その他設定が用意されていて、OS とは別に任意でインス
トールを行うようになっています。
結論を述べますと、私の環境では 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 で動かしたい方は、がんばってくださ
い。おそらくチャレンジしてる人はきっといます。
よう、世界
ここでは、Android 版の X11-BASIC のメニューを上から順
番に説明するスタイルをとります。Windows や Linux に
X11-BASIC をインストールした方なら、改めて読むほどの内
容ではないかもしれません。それでも、X11-BASIC を使う上
での約束事もあったりするのでご覧になってください。
X11-BASIC はスクリプト・インタプリタです。コマンドを
羅列したファイル(プログラム)を実行します。X11-BASIC の
プログラムでは通常、拡張子に「.bas」とか「.xbas」と付
けます。または、一行ずつコマンドを実行させるインタラ
クティブモードで実行することもできます。
Android でご利用の方は、X11-BASIC アプリのアイコンを
タップすると最初からインタラクティブモードになります。
Windows や Linux で X11-BASIC インタプリタを開始するに
は、いくらか方法があります。一番簡単な方法は、xbasic
とコマンドを打ち込む方法です。そうするとインタラク
ティブモードでインタプリタを使うことができます。
インタラクティブモード
************************************* * 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 >と表示されてると思います。
入力したコマンド文字列はメモリにバッファされるので、
上下キーを押して過去に入力した履歴を遡ることができま
す。
このようにコンソール画面に直接コマンドを入力してコ
ンピュータから返事を得る方法を、X11-BASIC ではインタラ
クティブモードと呼びます。いにしえの旧制 BASIC では、
ダイレクトステートメントと言ってたことができます。ち
なみに、英字は大文字でも小文字でも区別しません。
それでは次に足し算をします。
> print 1+1 2となったと思います。
print という命令はなんだろうと察するに、コンソールに
結果を出力する命令なんだと推測できると思いますよね。
プログラムはこういう命令を書いたコードをコンピュータ
に順番に実行させることです。
ここでコードを記述するために、いったん X11-BASIC を
終了させます。X11-BASIC を終了するには、右上のメニュー
から「Quit」を選ぶか、先ほどのプロンプトに「> quit」
と入力して改行(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 にコピーするこ
とにしてます。その方がバックアップになりますしね。
まずは慣例に倣い"Hello, World"を表示させます。
簡単に言えば、
(1)「print」という命令を使って"Hello,World"という文字
を表示させる。
(2)最後に「End」と書く。
の二点です。
ではエディタを開いて
print "Hello, World" end
と書き込んでください。半角英文字なら大文字でも小文字
でもいいです。
プログラムを書いたら保存しましょう。とりあえずお好
きなフォルダに保存してください。ファイル名は好きな名
前でいいです。Android OS のファイルシステムが全角日本
語をサポートしてるのでファイル名が漢字でもカタカナで
も読むことはできます。けど X11-BASIC が全角文字の入出
力は対応してませんので英字にしとくのが無難だと思いま
す。
拡張子は「.bas」としてください。
ファイル名に悩むなら日付で作ってみてください。2014
年 09 月 20 日なら「20150220.bas」みたいな感じで。題名
が思いつかなくても、いつ作ったのかわかるので悩んだと
きは良いです。
所望のディレクトリにプログラムを保存したら、その
ファイルを./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 してください。
すると先ほどエディタで作成したコードが表示されると
思います。
RUN
右上のメニューから「Run」を選んでください。またはプ
ロンプトの後に
> runと入れて Enter してください。
すると
> run Hello,Worldと出力されると思います。
NEW
NEW というコマンドは、読み込んだ X11-BASIC プログラム
をクリアする命令です。
右上のメニューから「New」を選んでください。または
> newと入力します。その後に、
> listと入力してもリストが表示されないことがわかります。
またプログラムを読み込みたいなら再度「Load」すれば
いいです。
QUIT
最後は QUIT で X11-BASIC を終了します。
Android の場合は、QUIT コマンドの使い方に注意してく
ださい。QUIT は本当に X11-BASIC というアプリを終了する
コマンドです。プログラム終了即ちアプリの終了というの
なら構わないんですが、計算結果を出力するプログラムだ
とアウトプットを読むことができなくなります。この場合
は、STOP や END を有効に使ってください。
ここまでの一連の操作の流れです
(Result) > load "test.bas" > listprint "Hello, World" end > run Hello, World > new > list > quit
最初のプログラムとして、まずは以上でございます。
文法と構文の基礎
プログラミングとは
「コンピュータ、ソフトなければただの箱」とは聞き古
した格言ですが、実際コンピュータを動かす際には、ソフ
トウェアが必要不可欠になってきます。このソフトウェア
によって、ワープロ、ゲーム、インターネットなど、私た
ちはコンピュータを様々な形で使うことができるのです。
「じゃぁ、ソフトウェアはどうやって作ってるの?」
それは、プログラミングによって作られます。ソフト
ウェアを正しく動かすには、その手順書、プログラムを作
る必要があります。その作業をプログラミングといいます。
これから、X11-BASIC でのプログラミングを色々書いてい
きます。まずはどんな入門書にも書かれているようなその
言語の生い立ちでも書いておきます。別に読み飛ばしても
困る話ではないのですが、なんというかこれから使い方を
思える言語への愛着というか、親しみというか持っている
といないのでは継続に違いはあると思うんですよね。意気
込みっていうんですか?そういうのを感じていただければ
いいと思います。
BASIC の生い立ち
BASIC は、1964 年ころにダートマス大学の J.G.ケメニー
と T.E.カーツによって開発された教育用プログラミング言
語です。当時、主流だった FORTRAN を手本としながらも、
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
行機械語に翻訳してたわけですが、構造化 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 年に欧州規格と米国規
格を包含する形で Full BASIC の ISO 規格を制定しました。
日本では、ISO 準拠の形で 1993 年に Full BASIC の JIS が制
定されました。
1989 年、米国でモジュールおよび単文字入力に関する追
加の規定が規格化されました。これは、JIS では参考として
収録されています。
問題解決指向
現在、広く用いられているプログラム言語のほとんどは、
プログラムを書く人自身の問題を解決するために書かれる
のではなく、他の誰かがユーザとして使うことを考えて作
り始めるのが普通です。プログラミングという体験に向か
う姿勢に違いがあるということがわかると思います。
しかし、本来の BASIC は、問題解決指向です。プログラ
ムを書くのは、他者に使わせるためではなく、プログラム
を作成する人自身の問題を解決するためです。他者に使わ
せるプログラムでは入力をわかりやすくするための装飾的
部分が重要になりますが、自分で使うプログラムでは装飾
的な部分や説明的な部分に手間をかけたいとは思いません。
Full BASIC はコンピュータの専門家でない人が問題を解
決するツールとして使うのを考えています。Visual Basic
は、割と他の人が使うことを想定して作るもんです。じゃ、
X11-BASIC は?ということになりますが、これは割とバラン
スのとれてる仕組みでどうとでも作ることができる気がし
ます。GUI 風に部品を綺麗に配置することも、または武骨に
ターミナル上でコマンドラインで使うこともできます。ま
あ、Visual Basic が GUI ベースの Windows を普及させるた
めの先人になってしばらく、だいぶこなれてきたというこ
とでしょう。
なんにしても、プログラミングという作業はお給料をも
らったり、クライアントさまのことを考えながら作るもの
だという思い込みは捨ててしまってかまいません。プログ
ラミングは日々の日記をブログに載せたり、チラシの裏に
描いた絵をスキャンして投稿したり、YouTube に動画を投稿
したりと同じく個人的体験だという。そこがポイントです。
BASIC バッシング
おおむね好意的に受け入れられてきた BASIC ですが、コ
ンピューターの世界には反対意見も存在していました。特
に目立って論陣を張っていたのが、オランダのコンピュー
ター科学者であるエドガー・ダイクストラ教授でした。
2002 年に亡くなったダイクストラ教授は BASIC に関して
「BASIC に一度でも触れたことがあるものに対して良いプロ
グラミングを教えることは事実上不可能である」と発言す
るなど、強硬な反 BASIC 論者として知られていました。
実際には、PL/I は「致命的疾病」、FORTRAN につい COBOL
に至っては「犯罪行為」とまで批判していたために BASIC
のみを標的にしていたものではなかったのです。まあ、批
判屋稼業というのはいつの時代もどんなところにもいるっ
てことでしょうか。ネガティブで不安を煽るニュースの方
が記憶にはよく残るもので、そういうわけで何かと BASIC
というと「ちょろい言語」という先入観を持たれるように
なりました。
しかし、現在でも Microsoft 謹製の他にもいろいろな
BASIC が生き残ってることを考えるとそうした印象が的はず
れだったとわかると思います。なぜでしょう。理由があり
ます。そもそも BASIC が初学者のプログラミングスキル習
得を目的としたプログラミング言語だからです。そこをよ
く誤解しますよね。新しいプラットホームができて、そこ
でプログラミングしてみようとする人が現れる限り、そこ
に BASIC があるわけなんです。
コンソールへの出力
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
>
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
代数を使うこともできます。
仮に 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 文には、コンマまたはセミコロンで区切って複数の
項目を書くことができます。
項目の区切り記号にセミコロンを用いると、各項目は詰
めて表示されます。項目の区切りにコンマを用いると、各
項目は一定の桁位置まで空白を出力した後に出力されます。
たとえば、
(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 に続けて数値を
代入したい変数をコンマで区切って並べます。
次のプログラムは、入力された 2 数の平均を表示します。
例ではセミコロンを末尾につけた Print 文を直前に入れ
ることで、何を入力するのか表す小技を使っています。
(X11-BASIC) Input " a= ? "; a Input " b= ? "; b Print (a + b) / 2 End (Result) a= ? 35 b= ? 66 50.5命題
数値
加減乗除の演算を、それぞれ、+、−、*、/で表します。
また、ベき乗の演算は、^という記号を用いて、たとえば、
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 10485761 行目は 2+3×4^2 を計算します。
2 行目は 3÷4×5 を計算します(3/(4×5)ではありません)。
3 行目は (2^4)^5 を計算します。ここで、ちゃんと( )で
囲まないと
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 110 進数整数を 16 進数や 2 進数表記に置き換えることがで
きます。16 進数は$(または 0x)と表現されます。2 進数表記
では%を用います。
%101010 -$FFE0 0xA0127BD -%10001001 %00011010算術関数
X11-BASIC は基本的な算術関係の関数を取り扱っています。
三角関数:SIN()とか ATAN() 対数:LOG() ビット演算:AND とか OR最大最小: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 + sign4 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"
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()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 + 1Print 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 変数を供します。
もし同じ名称の Global 変数があったとしても、Local に使
われてる変数とは別物と扱われます。
命名
変数の名前を命名するのに文字と数字を使うことができ
ます。変数名の中にスペースを入れることはできません。
そういうときはアンダースコアで代用してください。変数
名は複数文字を使ってある程度長くてもいいです。変数名
の最初の文字に数字やアンダースコアを使うことはできま
せん。X11-BASIC の命令に似た変数名にはしないでください。
トラブルの元になります。例えば、TRUE, FALSE, TIMER,
PC, TERMINALNAME$とかいうのも避けるべきでしょう。
確かに変数の命名はユーザに任せてます、しかし既に内
部変数として使われてる名前は使えません。それと次のよ
うな名前もつけるべきではありません。
x, auto%, lives%, bonus1%, x`1, city`name$
次のような変数にも X11-BASIC は警告を出します。
`blank, 1x, ?value%, 5s$.
変数名がコマンド名とか他の型の変数や配列名と区別の
つきにくい名前もよくありません。例えば、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]変数の型
変数に入ってる中身がなんなのかどうすれば知ることが
できるでしょう。X11-BASIC では、変数名そのものが変数の
型式を語ります。
X11-BASIC は特殊な印をつけることでデータ型を見分けま
す。X11-BASIC は、浮動小数点や整数、文字列や配列も扱え
るインタプリタです。配列の宣言には DIM 命令を使うもの
の、変数の型の宣言は必要ありません。X11-BASIC インタプ
リタは、変数名文字列の末尾で変数の型を認識するからで
す。
整数は「変数名%」、文字列は「変数名$」、配列は「変
数名()」。末尾にこれらの識別記号のない変数は実数
(Float)として扱われます。整数のポインタや関数の呼び出
しには文字列の先頭に「@」が使われます。それと論理型は、
整数と同じ記号が使われます。
注意していただきたいのは、個々の変数の用途や区別は、
名付け親であるあなたの命名センスを以って実現できてる
ことです。変数名の名付けで不精しないようにしてくださ
い。
(例) x=10.3 : 64bit 浮動小数点実数型 x$="Hello" : 文字列型 x%=5 : 32bit 整数型 @x : 関数プロシージャのコール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 とみなされます。
(結果がゼロ以外の値でなければならないことを意味しま
す)
代入文
変数に数値を記憶させることを代入といいます。変数に
新たな数値を代入すると、それ以前に保持していた数値は
消滅して参照できなくなります。
変数に数値を代入するのに数値式を用いると、右辺の値
が計算されて左辺の変数名が示す変数に代入されます。
文字列
文字列変数は、任意の長さのキャラクター(バイト)です。
仮想メモリが許す限りの長さを得ます。文字列は一般に
ASCII テキストで、必要ならば任意の長さのバイトコードも
保持することもできます。X11-BASIC は必要に応じて自動的
に解釈します。もしバイトコードを X11-BASIC が文字列と
判断すれば、長さ等も変わり、メモリ上の位置は変わるこ
とでしょう。文字列変数は「$」と決められています。文字
列定数は「" "」で囲みます。文字列に特殊文字を連結す
ることもできます。通常、文字列をサブストリングに分け
といて、実行するとキャラクタコードの断片を「+」で連
結するという手を使います。
st$="This is a special string, containing a bell character at the end"+chr$(7)
ちなみに、ダブルクォーテーション文字は chr$(34)で表
現できます。
配列
DIM 命令によって配列を宣言します。
配列はいくつもの型の変数を同時にメモリ上に保持しま
す。通常の変数は一度に一つだけの値を持ってますが、配
列は数個の値を持つことができます。変数にインデックス
と言う添字をつけることでそれぞれの値と対応付けます。
インデックスは「(」と「)」に囲まれた数値です。イン
デックスの数値に制限はありません。配列の次元にも制限
はありません。ただしインデックスと次元は、正の整数値
でかつメモリが許すだけになります。X11-BASIC の配列は、
文字列形式も含む任意のデータ型です。X11-BASIC 基本の特
殊な機能としては、配列の暗黙的な定義と配列定数の存在
です。
Dim b(10) a()=b()ここで、b()は事前に DIM 命令で定義されているものとし
ます。
a()=[1,2,3,4;6,7,8,9]配列定数を割り当てます(この例では、2 次元配列が作成
され、行がセミコロン「;」で分離されています)。
書式指定
Print <expression> Using"<format string>"
Print 文に書式指定を追加するときは、Print 文の後に
Using 書いて" "で囲まれた内部に節を書きます。
Print 数値式 Using "書式指定文字列"[,数値式 using "書式指定文字列"])
です。書式を作成するとき、整数部の桁数が不足しないよ
うに注意してください。特に、負数の場合、負号を出力す
る分の桁の確保を忘れないように。書式を指定すると、小
数部は指定された桁数に合わせて四捨五入されます。
数値の表現
数値表現の書式の詳細は次のようになります。
+ 数値の符号を書きます(任意)。 - 負である場合のみ数値の符号を書きます(任意)。 # 十進数の数値の桁数を指定します。指定された桁数より小さい場合は、 右詰めになります。 0 必要ならば(任意)。. 小数点の位置を表します。 , 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
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
例 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 "#.###^^^^"
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 は構造化された手続き型プログラミング言語で
す。それぞれが単一のユニットのように動作する複数のセ
クションで、プログラムは構成される、いわばカプセル化
された構造形態を持ちます。ブロックの始めと終わりは、
明示的なキーワードによって区切られます。
伝統的 BASIC の実装とは違い、X11-BASIC で行番号は使用
されません。一行はすべて何かしらの命令を持ちます。
Goto でのジャンプも可能ですが、そこはループと中止コマ
ンド(Exit If や Break)をご利用していただきたい。
任意の型の戻り値を持つプロシージャと関数は再利用可
能です。これによりプログラムをモジュール単位で構造化
できます。プログラムは、プロシージャや関数をコールす
るメインとなる部分を持ちます。その他のライブラリを
マージコマンドで追加することもできます。
1.プロシージャと関数
X11-BASIC には、プロシージャと関数の 2 つサブルーチン
の種類があります。この違いは、プロシージャは値を返さ
ず、関数は単一の値を返す点です。プロシージャや関数は、
メインブロックの後に書かれなければなりません。した
がって一般的な X11-BASIC プログラムの次の構造になりま
す。
Main program block :
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.0For 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サブルーチンの変数は、サブルーチン名の後ろの括弧の
間に配置され、メインプログラムでプロシージャを呼び出
した変数の配置と同じ順序でなければなりません。サブ
ルーチン内で使用されるすべての変数は、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 Return3.関数
関数は、関数名に続く Function ヘッダーで始まり、キー
ワード Endfunction で終了します。関数は、数値や文字列
の関数いずれかです。デフォルトでは数値関数です。文字
列関数は文字列を返し、「関数名$」で定義されます。関数
は、少なくとも 1 つの関数の値を返すための Return 文が必
要です。だいたい次のような形式で使用します。
Function FuncName[$](parameters) Local vars : function logic : Return value[$] Endfunction戻り値の型は、関数の型と一致する必要があります。文
字列関数は文字列を返しますし、数値関数は数値を返しま
す。数値はデフォルトでは実数として扱われます。Return
文が実行されると関数は呼び出し元に戻ります。E
ndfuncction 文は、関数の終わりを意味し、プログラムがこ
の文だけを実行しようとするとエラーになります。関数は
「@関数名」で呼び出されます。例として、文字列関数の
Copy$()を呼び出す例を示します。
Right$ = @Copy$("X11-Basic", 4)ここで呼び出される Copy$()という関数が次の様になりま
す。
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関数 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 命令は、そのプロシージャまたは関数でだけ通用す
る変数を定義します。サブルーチンのパラメータは、ロー
カル変数です。サブルーチンが別のサブルーチンを呼び出
すとき、呼び出しルーチンのローカル変数は、グローバル
変数のように呼び出されたルーチンでは認識されます。
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(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