UnitPoint
> for(var i = 0; i < this; i++){
> func(i)
> }
как я сразу не догадался! нет ну не поверите, я на полном серьезе, меня так сбил сахарный синтаксис что я сильно тупил как сделать банальный цикл. тут прослеживается перл - есть много способов сделать это, то есть никак не питон
UnitPoint
> 5.times{|i| print i}
все-таки я за читаемость исходного кода. Скрипт должен быть компактным, но код не должен выглядеть так, как будто это инопланетный шифр. Для этих целей существует спец. дисциплина.
было бы интересно померить скорость вызовов из плюсов функций скрипта(и наоборот) по сравнению с 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. подключение классов также делается просто, я опишу в одном из следующих сообщений.
Так я же не про удобство подключения писал, а про скорость вызовов скриптовых функций из плюсов и плюсовых из скриптов :)
Pushkoff
> думаю ценители оценят силу разума
> placement new over malloc, хотя такой вариант не кидает исключений))
UnitPoint, тоесть память тоже в крошку?
в общем интересно послушать как она там с памятью внутри обращается, может ли жить в арене например одной, какая фрагментация и т.д
скорость вызовов скриптовых функций из плюсов и плюсовых из скриптов
Вызов из OS функций на C++ и обратно выполняется мгновенно, даже быстрее, чем вызов из OS функций на OS.
тоесть память тоже в крошку?
Что значит в крошку?
в общем интересно послушать как она там с памятью внутри обращается, может ли жить в арене например одной, какая фрагментация и т.д
Все вызовы по запросам и освобождению памяти происходят через интерфейс MemoryManager. Встроенный менеджер памяти (класс SmartMemoryManager) очень эффективен, использует свой кеширующий механизм для оптимизации по скорости и уменьшению дефрагментации. Также можно использовать свой менеджер памяти при желании.
MATov
лучше глянь код... но листани сразу где-то на середину
Пример реализации средствами языка 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
Андрей5000
> один cpp в 21 тысячу строк это жёстко. неудобно же с кодом работать.
Это очень хорошо. С кодом в данном случае не нужно работать, его нужно подключить и забыть. Библиотечный же модуль же. И то, что всего 21 тыща строк - это тоже довольно и весьма. Говорю, как пытающийся сам медитировать над велосипедным языком, и прозревающий скучную перспективу со значительно большим их количеством.
UnitPoint
Какой парсер используется? Recursive descent?
Работает на основе результатов работы лексера?
Поддерживаемая грамматика какая?
Sbtrn. Devil
а можно сразу писать нормально, а один большой файл получить допустим этим https://github.com/vinniefalco/Amalgamate/
Pushkoff
> а можно сразу писать нормально, а один большой файл получить допустим этим
> https://github.com/vinniefalco/Amalgamate/
Нормальнописание быстро вводит в соблазны, типа статических переменных/функций и using namespace. А что-то мне подсказывает, что "допустим это" на таких нюансах будет трагически спотыкаться.
x
Какой парсер используется?
Парсер свой, все свое, сначала разбирается на токены, а потом идет разбор синтаксиса, например, как в скриптовом языке от id Software для doom3 (d3/q4/etqw/prey).
Sbtrn. Devil
Это очень хорошо. С кодом в данном случае не нужно работать, его нужно подключить и забыть.
Спасибо, полностью согласен.
Почитал тему - все нравится. Ну как все - мне не нравится писать код без ";", но это ведь опция - и значит я могу спокойно ставить свои любимые семиколоны.
Биндинг выглядит удобным, в отличие от того же луа, не говоря уже про питон. Жду поста про биндинг классов.
jaguard
если интересуют аналоги, то обрати внимание на
http://www.gmscript.com/
http://www.simion.co.uk/gs9/
https://code.google.com/p/nullc/
http://root.cern.ch/drupal/content/cint
Pushkoff
Как-то они не впечатляют. Либо код биндинга страшный, либо его вообще нет :).
Цинт это вообще что-то отдельное - я его как-то копал, понял что такого монстра мне даже ради скриптов на си не надо.
У топикстартера пока выигрышнее выглядит. Если все действительно так как оно выглядит (то есть для биндинга функции не надо ручками прописывать типа параметров, и при этом достаточно одной простой строки кода), то мне такая ВМ подходит.
jaguard
> в отличие от того же луа
Ну у луа во-первых есть ffi биндинги, это позволяет биндить просто подгрузкой заголовочного сишного файла, а про питон со swig я вообще молчу - там всё автоматически делается. Особой разницы с питоновскими или луашными биндами я не вижу.
Тема в архиве.