29 сентября 2012 в 21:02

ObjectScript API, интеграция с C++. Часть 2: выполнение скрипта на OS из C++ tutorial

ObjectScript — новый объектно-ориентированный язык программирования с открытым исходным кодом. ObjectScript расширяет возможности таких языков, как JavaScript, Lua и PHP.

Часть 2: выполнение скрипта на OS из C++


Возьмем пример кода на OS из Части 1: работа со стеком, вызов функций OS из C++. Сделаем файл main.os со следующим содержимым:

print("10 * (3+2) = ", 10 * (3+2))

bar = {firsname="James", lastname="Bond"}
bar.profession = "actor"
print bar

print(concat(5, " big differences"))

Программа на C++, запускающая скрипт, будет выглядеть так:

#include "objectscript.h"

using namespace ObjectScript;

int main()
{
    OS * os = OS::create();
    os->require("main.os");
    os->release();
    return 0;
}

при выполнении программы в консоль выведется следующее:

10 * (3+2) =    50
{"firsname":"James","lastname":"Bond","profession":"actor"}
5 big differences


Вы можете скачать исходники ObjectScript и пример из данной статьи по этой ссылке, открыть proj.win32\examples.sln, проект run_os_prog.

Другие релевантные статьи об ObjectScript:

+12
3507
46
evgeniyup 27,0

Комментарии (2)

0
silvansky, #
Вопрос: а как получить результат работы скрипта в C++-коде?
+1
evgeniyup, #
Пример: вызовем функцию concat с двумя параметрами и получим результат в C++:

os->getGlobal("concat");    // добавляем в стек глобальную функцию concat
os->pushNull();             // добавляем this для функции concat
os->pushNumber(5);          // первый параметр для concat
os->pushString(" big differences"); // второй параметр для concat
os->call(2, 1);             // вызываем функцию concat с 2 параметрами, затребуем 1 результат
OS::String res = os->popString(); // сохраним результат в виде строки и уберем его из стека

OS API реализует целый ряд функций для преобразования значений в стеке в простые типы, например, toFloat, toDouble, toInt, toString, toUserdata, popFloat, popBool и т.д.

Пример функции, которую я использую для преобразования объекта {x=10 y=20} в стеке по смещению offs в b2Vec2 (это из интеграции с Box2d):

static b2Vec2 to(OS * os, int offs)
{
	if(os->isObject(offs)){
		os->getProperty(offs, "x"); // required
		float x = os->popNumber();
	
		os->getProperty(offs, "y"); // required
		float y = os->popNumber();

		return b2Vec2(x, y);
	}
	os->triggerError(OS_E_ERROR, "point expected");
	return b2Vec2(0, 0);
}

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.