Пользователь
0,0
рейтинг
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:

Евгений Головин @evgeniyup
карма
54,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • 0
    Вопрос: а как получить результат работы скрипта в C++-коде?
  • +1
    Пример: вызовем функцию 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);
    }
    

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