Squirrel

C++インスタンス関数を呼び出すSquirrelインスタンス関数(マイフェイバリットな)

SQPlusはC++のインスタンスをinstanceupへ、関数ポインタをfunctionのfree variableへいれてる。free variable分はいらなくないか?と思ったので。自分はこんなふうに書いた。テンプレートってホント融通きくなあ。 inline static void mysq_register_functi…

訂正?関数コンテクストについて

以前A.a() はコンテクストをAとしてAの中で"a"と名前のつけられたclosureを探して実行すると書いた。だとするとこれは期待通りに動かないのか? class Base { function set(v) { value = v; } value = 0; } class Deriv extends Base { // ↓ この部分でクラ…

クラスとインスタンス

Squirrelのクラス定義は記述上ではテーブルの定義とほとんど同様である。ただし要素の動的削除はできない。追加書き込み専用である。ドキュメントにもあるとおり、クラスからインスタンスが初めて作成された時点で要素の追加や値の変更がロックされる。これ…

ちょっと変なコード

sq>s <- "aaa"; sq>print(s.len()); 3 sq>function f() { print(len()); } sq>f.call(s); 3 関数コンテクストには何でも入り得るということ。default delegateもハッシュテーブルの項目と同様の、単なる検索される要素として提供されているということ。

implicit delegation

関数コンテクストやGetの対象のSQObjectがテーブルであった場合、当然真っ先にこのハッシュテーブル内を検索するわけだが、ここで名前が見つからなかった場合にエラーとせず、あらかじめこのテーブルへ設定しておいた次の検索対象候補としての別のテーブルへ…

Get

Squirrelスクリプトの基本的で一貫したルールとして、exp_context.exp と書くことはexp_contextという名前のSQObject内に、"exp"という名前のつけられたSQObjectを探すことを指す。内部的にはこのような . 演算子はコンテクストとなるSQObjectの実際の型に関…

関数コンテクスト、thisについて

Squirrelでは関数実行には関数そのものと同時にコンテクストとなる変数(environmentとも呼ばれる)を指定する必要がある。この変数は関数内ではthisとしてアクセス可能なほか、関数内で出現する変数や関数などの名前はコンテクスト内を最優先に検索される。S…

fundamentalな部分についてまだ書くよ

前述のSQObject構造体はすべてのSquirrelが提供する型を格納できるようになっている。ハッシュテーブルや配列や文字列、プリミティブ型は当然のことながら、C++側で定義された関数の定義(native closureと呼ばれる)、squirrelで定義された関数の定義(closure…

メモリ管理とか

メモリ管理について。LuaがあくまでGCなのに対してSquirrelは基本的なメモリのライフタイムの管理にリファレンスカウンタを採用している。バリアント変数の実体のような、すべての型の共用体とその内容の型情報を保持するSQObject構造体があり、これを継承し…

squirrelについて書く前に2

アプリケーションのマクロや設定ファイルのパーサーにしか使わないというのなら話は別だが、ゲームのメインループに組み入れて頻繁に駆動させるのであれば、組み込み言語内で実際に何が行われているかを把握しておく必要がある。最適化やデバッグ等を考えた…

squirrelについて書く前に

luaとかsquirrelといった組み込み用言語はhost systemに組み込めてナンボ、それでいて高速に動いてナンボなので、マスターした言語コレクションの一つに加えたいとかそういう人はあっちいってくれ。一番の問題は本体と組み込み言語のどこでそれぞれを切り分…