Squirrel その2

前回の続き。
まずは Squirrel をDLしてきます。公式サイトからSourceForgeに飛んでDLできます。
メイクファイルも付属していますが、VC6プロジェクトファイルが付属しているのでVS使用者なら簡単にビルドできるでしょう。
エラーが出るかもしれませんが、簡単に直せると思います。
ライブラリ以外に sq.exe があり、これを使用すれば Squirrel ソースファイルのコンパイルや実行が可能です。
実行は以下のコンソールコマンドです。

sq ファイル名

Squirrel ソースファイルのデフォルト拡張子は .nut です。リスだからナッツ、ということなのでしょう、きっと。
まず、適当なソースファイル(test.nut とか)を作成し、以下のように書いてください。

print("Hello World!");

なお、セミコロンはなくても可。Cプログラマならつけておいた方がわかりやすいと思いますが。
これを実行すると、コンソールに Hello World! と出力されます。
Cと違って、main() 関数は存在しません。関数として宣言されていない命令はすべて実行されます。
print() 命令はCの printf() 命令と似ていますが、文字列でなくても指定することが出来ます。

print(1);
print(0.55);

数値がそのまま文字列として出力されます。
文字列と数値や変数を出力する際には + を利用します。

local a = 10;
print("a = " + a + "\n");

変数はローカル変数とグローバル変数が使用できます。
ただし、グローバル変数は暗黙的に存在するルートテーブルのスロットとして登録されます。
変数には整数、浮動小数点数、文字列、NULL、BOOLがあります。
整数は10進数以外に16進数も使用可能です。また、一文字も整数として扱われます。

local a = 10;
local b = 0x0010;
local c = 'c';

浮動小数点は f をつけてはいけません。BOOL は true か false です。
null で初期化するか、初期化を行わないと NULL オブジェクトになります。
文字列は " で囲みます。また、こんな指定の仕方も出来ます。

local a = "I am Sam.\nI am not John.\n";
local b = @"I am Sam.
I am not John.
"

@ を付けるとソースコード中の改行を文字列の中に加えてくれます。結構便利ですよ。
これらは代入の段階で型が決定されます。これらの型は別の型を代入することでその型に変更することが可能です。
ただし、テーブル、配列、クラスとの間で型変換は出来ません。
テーブルは Lua と同じように初期化できます。

local a = {};
local b = {
    i = 10,
    f = 0.55,
    str = "I am string.",
    [1] = 3,
};

この例で、a は空のテーブルです。あとからスロット(要素)を追加することが可能です。
b の各スロットにアクセスするにはCと同じやり方か、配列のような指定が使えます。

b.i = 20;
b["str"] = "I am not integer.";
b[1] = 10;

Lua ではスロットの追加は新規のスロット名に適当に代入すればよかったのですが、Squirrel では明示的にスロットの追加を行わないといけません。

a.i = 20; // エラー。暗黙的なスロットの追加はされない。
a.i <- 20; // i というスロットが追加され、整数 20 で初期化される。

グローバル変数はルートテーブルのスロットとして登録されるので、Lua のように local を付けないだけではエラーになります。

ga = 1; // エラー。
ga <- 1; // ルートテーブルにスロットが追加される。

配列はテーブルを使用しても何とかなりますが、配列の方が高速に動作します。

local a = [];
local b = [10, 20, 30];

配列の番号は 0 からです。
この例で b は要素数 3 の配列になります。a は空の配列です。
テーブルのようなスロットの追加は出来ません。初期化と似たような方法になります。

a[0] <- 10; // エラー。
a <- [10, 20, 30]; // これならOK。
b <- [40, 50]; // 要素数は 2 になってしまう。追加はされない。

決まった要素数の配列は組み込み関数を使用します。Cのような方法ではエラーとなります。

local c[10]; // エラー。
local c = array(10, 0); // 要素数 10 の配列を 0 で初期化する。

スロットの追加は特にミスしやすい部分だと思います。気をつけてください。
テーブルと配列の場合、代入は参照渡しになります。
コピーを渡す場合は clone 命令を使います。

local a = {
    val = 10
};
local b = a;
b.val = 20; // a.val も 20 になる
local c = clone a;
c.val = 30; // a.val は変化しない


なお、Luaにあった複数の変数への代入は出来ません。

a, b = 10, 20; // LuaではOKだったが、Squirrel では代入されない。エラーにはならないけど。

今日はここまで。
次回も言語仕様について解説します。