ObjectScriptは、新しいオープンソースのオブジェクト指向プログラミング言語です。 ObjectScriptは、JavaScript、Lua、PHPなどの言語の機能を拡張します。 彼のプレゼンテーションは、
この記事でしばらく前にハブで行われ、読者の間で興味と熱烈な議論を呼び起こしました。 そのため、プレゼンテーションにこだわらず、ObjectScript APIについて説明しないことにしました。
APIの説明をいくつかの部分に分けて、記事をできるだけ短くするようにします。
パート1:スタックの操作、C ++からのOS関数の呼び出し
OS(ObjectScript)を使用した最小限のプログラムは次のとおりです。
#include "objectscript.h" using namespace ObjectScript; int main() { OS * os = OS::create();
つまり OSインスタンスを作成し、それを使用して正しく
delete
ます。ただし、
delete
オペレーターだけでなく、
release
メソッドを呼び出します。
OSインスタンスは必要な数だけ同時に作成でき、必要に応じて、互いに完全に独立して動作します。
次に、
TODOの代わりに配置する必要があるコードの例を示し
ます 。
メインコードはこちらです。
それでは、C ++を使用して次のOSコードをシミュレートしましょう。
print("10 * (3+2) = ", 10 * (3+2))
ここにあるもの:2つのパラメーターを持つグローバル関数の呼び出し。1つ目は定数文字列、2つ目は数学演算の結果です。
最初に行うことは、関数呼び出しを準備することです。 これを行うには、スタックに2つの値を配置する必要があります。1つ目は関数自体で、2つ目はこの関数の値です。 たとえば、静的関数など、関数がこれを使用しない場合、
null
を
this
として配置する必要があります。 このようにします:
os->getGlobal("print");
次に、関数が呼び出されるパラメーターをスタックに追加します。
os->pushString("10 * (3+2) = ");
次に、2番目のパラメーターの数学演算をシミュレートします。
os->pushNumber(10);
できた!
runOp
メソッドは、OSカーネルを使用して、スタック内の値に対して数学、論理、およびビットごとの演算子を実行できます。 つまり、必要に応じて、型変換などが行われます。...
OP_ADD
は、スタックの最上部の2つの値(つまり、最後に2回スタックに置かれた値)に対して加算演算子を実行します。 この場合、結果はスタック上の値を置き換えます(つまり、2つの値がスタックから削除され、結果が追加されます)。
OP_MUL
乗算についても同様です。
現時点では、スタックに4つの値があります:
1-関数、
2 -null、
3-文字列、
4-数値。 いいね! あなたは電話することができます:
os->call(2);
それだけです、私たちはコンソールを見ます(コンソールに印刷結果を印刷)、それは次のようになります:
10 * (3+2) = 50
この場合、スタックは完全に空になります。 関数を呼び出すときに使用される4つの値は、スタックから削除されます。
例2
OSで次のコードをシミュレートします。
bar = {firsname="James", lastname="Bond"} bar.profession = "actor" print bar
スタック上に新しいオブジェクトを作成します。
os->newObject();
最初のプロパティ
firsname="James"
設定します。
os->pushStackValue(-1);
-1は、スタックの最上部への相対ポインターです。 プロパティを設定するスタックにオブジェクトを追加します(オブジェクトは参照によりスタックに追加されます)。
os->pushString("firsname");
setProperty
メソッドは、プロパティを設定し、使用されている値をスタックから削除します(この場合、スタックの最上部で3つの値が使用されます:オブジェクト、プロパティ名、および値)。
2番目のプロパティでも同じことを行いますが、より短い方法で行います。
os->pushString("Bond");
-2はスタックの先頭から2番目の値への相対ポインターであり(これがオブジェクトです)、文字列
"Bond"
がスタックの先頭になりました。
オブジェクトをグローバル変数
barに保存し
ます :
os->setGlobal("bar");
現在、スタックには値がありません。 次に、コード
bar.profession = "actor"
実行します。
os->getGlobal("bar");
完了、
print bar
:
os->getGlobal("print");
コンソールを見ると、次のようになっているはずです。
{"firsname":"James","lastname":"Bond","profession":"actor"}
例3
OSで次のコードをシミュレートします。
print(concat(5, " big differences"))
通常どおり開始します。
os->getGlobal("print");
この段階で、2つのパラメーターを使用して関数を呼び出し、出力で1つの結果を要求しました(0の結果を要求した場合、concatは1つのデフォルト結果を返します。関数呼び出しの後、2つ以上の値が必要な場合、最初の結果はconcat関数からのもので、残りはnullで補完されます)。
次に
print
呼び出し
print
。
os->call(1);
コンソールでは次のようになります。
5 big differences
プログラムの全文:
#include "objectscript.h" using namespace ObjectScript; int main() { OS * os = OS::create(); os->getGlobal("print");
ObjectScriptのソースコードとサンプルは、
このリンクのこの記事からダウンロードでき、
proj.win32 \ examples.sln 、
stack_usageプロジェクトを
開きます。