ПроектыФорумОцените

ObjectScript — добавлено видео по установке под Windows, новый встраиваемый язык программирования (скрипты, веб, 2d mobile engine) (3 стр)

Страницы: 1 2 3 4 512 Следующая »
#30
23:16, 19 фев 2013

UnitPoint
> for(var i = 0; i < this; i++){
> func(i)
> }
как я сразу не догадался! нет ну не поверите, я на полном серьезе, меня так сбил сахарный синтаксис что я сильно тупил как сделать банальный цикл. тут прослеживается перл - есть много способов сделать это, то есть никак не питон

UnitPoint
> 5.times{|i| print i}
все-таки я за читаемость исходного кода. Скрипт должен быть компактным, но код не должен выглядеть так, как будто это инопланетный шифр. Для этих целей существует спец. дисциплина.

#31
9:12, 20 фев 2013
было бы интересно померить скорость вызовов из плюсов функций скрипта(и наоборот) по сравнению с Lua и особенно AngelScript у которого это особенно шустро получается :)

Пусть у нас на С++ есть следующая функция:

std::string getcwdString()
{
    const int PATH_MAX = 1024;
    char buf[PATH_MAX];
    getcwd(buf, PATH_MAX);
    return buf;
}

Чтобы подключить ее в глобальное пространство имен на OS, нужно выполнить из C++ следующий код:

os->setGlobal(def("getcwd", getcwdString));

где os - экземпляр OS.

Вызываем функцию из OS:

print "getcwd: "..getcwd()

Вывод:

getcwd: C:\Sources\OS\proj.win32\osbind

Подключение модуля с функциями

Пусть у нас есть следующие функции на С++ (обратите внимание на то, что функции принимают и возвращают совершено разные типы данных):

bool my_isdigit(const OS::String& str)
{
    int len = str.getLen();
    for(int i = 0; i < len; i++){
        if(!isdigit(str[i])){
            return false;
        }
    }
    return len > 0;
}

std::string my_hash(const char * str)
{
    int i, len = strlen(str), hash = 5381;
    for(i = 0; i < len; i++){
        hash = ((hash << 5) + hash) + str[i];
    }
    hash &= 0x7fffffff;
    char buf[16];
    for(i = 0; hash > 0; hash >>= 4){
        buf[i++] = "0123456789abcdef"[hash & 0xf];
    }
    buf[i] = 0;
    return buf;
}

void my_print_num(int i)
{
    printf("my_print_num: %d\n", i);
}

void my_print_void(void)
{
    printf("my_print_void\n");
}

long double my_fabs(long double a)
{
    return a >= 0 ? a : -a;
}

Конечно, пользовательские функции могут принимать множество параметров. Подключаем функции к OS как модуль my:

OS::FuncDef funcs[] = {
    def("isdigit", my_isdigit),
    def("hash", my_hash),
    def("print_num", my_print_num),
    def("print_void", my_print_void),
    def("abs", my_fabs),
    {}
};
os->getModule("my");
os->setFuncs(funcs);
os->pop();

Готово, теперь их можно использовать в OS:

print "my.isdigit(123): "..my.isdigit("123")
print "my.isdigit(123q): "..my.isdigit("123q")
print "my.hash(123): "..my.hash(123)
print "call my.print_num(123.5)"
my.print_num(123.5)
print "call my.print_void()"
my.print_void()
print "my.abs(-123.5): "..my.abs(-123.5)

Вывод:

my.isdigit(123): true
my.isdigit(123q): false
my.hash(123): bf9878b
call my.print_num(123.5)
my_print_num: 123
call my.print_void()
my_print_void
my.abs(-123.5): 123.5

P.S. подключение классов также делается просто, я опишу в одном из следующих сообщений.

#32
11:50, 20 фев 2013

Так я же не про удобство подключения писал, а про скорость вызовов скриптовых функций из плюсов и плюсовых из скриптов :)

Pushkoff
> думаю ценители оценят силу разума
> placement new over malloc, хотя такой вариант не кидает исключений))

UnitPoint, тоесть память тоже в крошку?
в общем интересно послушать как она там с памятью внутри обращается, может ли жить в арене например одной, какая фрагментация и т.д

#33
14:10, 20 фев 2013

скорость вызовов скриптовых функций из плюсов и плюсовых из скриптов

Вызов из OS функций на C++ и обратно выполняется мгновенно, даже быстрее, чем вызов из OS функций на OS.

тоесть память тоже в крошку?

Что значит в крошку?

в общем интересно послушать как она там с памятью внутри обращается, может ли жить в арене например одной, какая фрагментация и т.д

Все вызовы по запросам и освобождению памяти происходят через интерфейс MemoryManager. Встроенный менеджер памяти (класс SmartMemoryManager) очень эффективен, использует свой кеширующий механизм для оптимизации по скорости и уменьшению дефрагментации. Также можно использовать свой менеджер памяти при желании.

#34
15:33, 20 фев 2013

MATov
лучше глянь код... но листани сразу где-то на середину

#35
11:17, 21 фев 2013

Пример реализации средствами языка ObjectScript функции each из jQuery.

Добавим функцию each в прототип объектов (все типы в OS унаследованы от Object).

function Object.each(func){
  for(var k, v in this){
    func(k, v)
  }
}

Готово! пробуем, например, для массива:

[10 20 30 40].each {|i a|
  print a
}

выведет:

10
20
30
40
#36
11:34, 21 фев 2013

Андрей5000
> один cpp в 21 тысячу строк это жёстко. неудобно же с кодом работать.
Это очень хорошо. С кодом в данном случае не нужно работать, его нужно подключить и забыть. Библиотечный же модуль же. И то, что всего 21 тыща строк - это тоже довольно и весьма. Говорю, как пытающийся сам медитировать над велосипедным языком, и прозревающий скучную перспективу со значительно большим их количеством.

#37
11:35, 21 фев 2013

UnitPoint
Какой парсер используется? Recursive descent?
Работает на основе результатов работы лексера?
Поддерживаемая грамматика какая?

#38
13:50, 21 фев 2013

Sbtrn. Devil
а можно сразу писать нормально, а один большой файл получить допустим этим https://github.com/vinniefalco/Amalgamate/

#39
17:08, 21 фев 2013

Pushkoff
> а можно сразу писать нормально, а один большой файл получить допустим этим
> https://github.com/vinniefalco/Amalgamate/
Нормальнописание быстро вводит в соблазны, типа статических переменных/функций и using namespace. А что-то мне подсказывает, что "допустим это" на таких нюансах будет трагически спотыкаться.

#40
17:50, 22 фев 2013

x

Какой парсер используется?

Парсер свой, все свое, сначала разбирается на токены, а потом идет разбор синтаксиса, например, как в скриптовом языке от id Software для doom3 (d3/q4/etqw/prey).

Sbtrn. Devil

Это очень хорошо. С кодом в данном случае не нужно работать, его нужно подключить и забыть.

Спасибо, полностью согласен.

#41
15:34, 26 фев 2013

Почитал тему - все нравится. Ну как все - мне не нравится писать код без ";", но это ведь опция - и значит я могу спокойно ставить свои любимые семиколоны.
Биндинг выглядит удобным, в отличие от того же луа, не говоря уже про питон. Жду поста про биндинг классов.

#42
16:55, 26 фев 2013

jaguard
если интересуют аналоги, то обрати внимание на
http://www.gmscript.com/
http://www.simion.co.uk/gs9/
https://code.google.com/p/nullc/
http://root.cern.ch/drupal/content/cint

#43
20:36, 26 фев 2013

Pushkoff

Как-то они не впечатляют. Либо код биндинга страшный, либо его вообще нет :).
Цинт это вообще что-то отдельное - я его как-то копал, понял что такого монстра мне даже ради скриптов на си не надо.

У топикстартера пока выигрышнее выглядит. Если все действительно так как оно выглядит (то есть для биндинга функции не надо ручками прописывать типа параметров, и при этом достаточно одной простой строки кода), то мне такая ВМ подходит.

#44
20:42, 26 фев 2013

jaguard
> в отличие от того же луа
Ну у луа во-первых есть ffi биндинги, это позволяет биндить просто подгрузкой заголовочного сишного файла, а про питон со swig я вообще молчу - там всё автоматически делается. Особой разницы с питоновскими или луашными биндами я не вижу.

Страницы: 1 2 3 4 512 Следующая »
ПроектыФорумОцените

Тема в архиве.