EvilSpirit
Спасибо за конструктивную критику!
Несколько фактов (больше наверное интересных):
Буферизованный вывод в ObjectScript и PHP предназначен для контроля вывода данных. В сравнительной таблице представлены ряд функций в обоих языках. В ObjectScript в наименованиях функций используется один принцип: стековая модель механизма буферизации. Иначе говоря, когда мы начинаем буферизацию, то вызываем функцию ob.push(), а когда заканчиваем - ob.pop(), получение содержимого текущего буфера делается функцией ob.getContents(). В PHP наблюдается некоторая разношостность в наименованиях функций.

А теперь самое интересное:
- в PHP буферизованный вывод является стандартом языка
- в ObjectScript буферизованный вывод реализован средствами ObjectScript в библиотеке webcore.os.
Хитрость заключается в том, что любой вывод в ObjectScript в конечном случае вызывает глобальную функцию echo и если ее "перегрузить", то можно делать разные любопытные вещи, например, реализовать буферизованный вывод. А "перегрузить" ее можно в самом же скрипте на ObjectScript!
К слову сказать, в отличии от ObjectScript, echo в PHP не является функцией, а является зарезервированной служебной конструкцией языка.
Где используется буферизованный вывод?
Обычно таким образом делают декотароры. Например, можно перехватить весь вывод, а затем его пожать (все современные браузеры умеют принимать сжатые html страницы). Но сейчас это не очень актуально, т.к. обычно настраивается средствами веб-сервера. Др. вариант использования в виджетах в веб-фреймворках (пример из файла tutorial.firstpage.osh - взято из исходников сайта http://objectscript.org):
<pre class="prettyprint"><% @controller.beginWidget("HtmlEncodeWidget") %> <!DOCTYPE html> <html> <head> <title>Тестируем ObjectScript</title> </head> <body> <p>Привет мир!</p> Я программирую на OS, 5 в степени 2 = 25 </body> </html><% @controller.endWidget( "HtmlEncodeWidget") %> </pre>
В данном случае виджет HtmlEncodeWidget работает как декоратор, заменяя специальные символы в содержимом (то что между beginWidget и endWidget), чтобы они не помешали верстке:

P.S. конечно же виджет HtmlEncodeWidget реализован на самом же ObjectScript:
HtmlEncodeWidget = extends Widget {
init = function(){
super()
ob.push()
},
run = function(){
echo html.encode(ob.popContents())
},
}Pushkoff (ссылка на сообщение)
> лайкнул на гитхабе. сразу писал все в одном файле или склеивал тулзой?
О, вот за это спасибо огромное!
Делал все в одном файле, мне так удобнее. Например, опубликованная моя мобильная игра Где мой дом? (opensource) тоже написана в таком стиле (см. MonsterHome.cpp).
UnitPoint
мне больше нравится куча файлов поменьше и со смыслом, но когда работаю с чужими либами - намного приятнее включить в проект один файл и не париться с компиляцией библиотек, линковкой хидерами и прочим. на гитхабе есть проект amalgamation который делает приблизительно такой же файл как релизы sqlite или lemon.
думал может у тебя какой-то свой специфический способ
Pushkoff
> мне больше нравится куча файлов поменьше и со смыслом, но когда работаю с
> чужими либами - намного приятнее включить в проект один файл и не париться с
> компиляцией библиотек, линковкой хидерами и прочим.
+1
я в своих проектах делаю хедер с инклудами всех cpp файлов и подключаю его в cpp файле, получается много маленьких файлов и удобно подключать.
Pushkoff
> но когда работаю с чужими либами - намного приятнее включить в проект один файл
> и не париться с компиляцией библиотек
+ 100500!
Особенно когда мультиплатформа, и туже самую библу нужно компилить много раз - ад
Хороший пример, по мойму это pugi xml
Кстати судя по сайту OS - теперь это движек для сайтов, а не скриптовый для игр
Не совсем. Веб-разработка - это один из примеров использования ObjectScript, который построен на os-fcgi (opensource) - реализация протокола FastCGI и использование скриптового языка ObjectScript для исполнения сценариев.
За последнее время ObjectScript обзавелся множеством дополнений и улучшений. Наконец-то реализованы операторы +=, -= и др. подобные, операторы ++/-- теперь работают не только для локальных переменных, а и для свойств объектов и элементов массивов, добавлен дополнительный (пятый) синтаксис для описания строковых констант без слеширования символов
`/\d+\.*/`
(такую запись очень удобно использовать, например, для описания регулярных выражений) и мн. др.
Было бы не плохо добавить всяких штук из функциональных языков, матчинг аля эрланг, корутины и т.д, если еще нет, конечно, генераторы списков
ObjectScript поддерживает лямбда функции и замыкания. В контексте функциональных языков можно привести пример вида:
var a = {|x|x**0.5}( 2)это объявление и вызов лямбда функции, считающей корень из x (возвести в степень 0.5).
Главная цель ObjectScript - возможность использования в той нише, где используется JavaScript в качестве скриптовых языков.
Вот некоторые отзывы об ObjectScript и причины почему он может быть полезен в данном контексте:
- сейчас мы работаем над проектом, в основе которого лежит JScript (реализация V8). к сожалению реалии оказались таковы, что гуглы начали ломать API с такой дурью, что поддержка проекта оказалась слишком сложной.
- этот V8 меня в могилу загонит :)
- насколько же твой API по ObjectScript проще чем в V8... я прямо душой отдыхаю :)
- у тебя API очень легковесный для встраивания...
Я сообщу более детально о проекте, в котором идет активный переход с JavaScript на ObjectScript, чуть позже. Сейчас в данном проекте используется множество исходников на JS общим объемом более 1 Мб и примерно половина уже переведено на OS.
Помнится, спрашивали про игровые демки на ObjectScript, такое появилось (буквально в соседней теме). см. OS2D engine - 2d мобильные игры на языке ObjectScript. Там есть и видео и откомпилированная прога для попробовать, а также полные исходники.
У вас случаем не упростилось API загрузки байт кода скриптов из памяти? Последний раз, когда смотрел, требовалось перекрывать кучу методов. И кажется были проблемы с иcпользованием int и bitwise операторов.
PsychoMan
Вы можете начать использовать ObjectScript, размещая скрипты в файле(ах). Это подходит для большинства случаев, в том числе при программировании мобильных игр. С этого можно начать, а далее уверен, что не решаемых проблем нет, я помогу.
С int и bitwise работает все аналогично JavaScript. Кроме этого ObjectScript позволяет создавать пользовательские классы и перегружать операторы, что можно использовать при разработке специальных классов, например, BigNumber и работать с ними как с обычными числами.
В движке OS2D используется vec2 (точка x, y), который реализован полностью на ObjectScript, см. vec2.os
UnitPoint
Молоток, если потеснишь js и cofee script хотя бы частично это будет большая удача!
А как если не секрет реализована работа OS на стороне клиента? То есть там где и JS работает?
ObjectScript - это в первую очередь очень легкий встраиваемый язык в программы на C++. Также готов веб-фреймворк для разработки на OS, в замен PHP, например. Пример его использования - сайт http://objectscript.org , который сам написан на ObjectScript.
Вышло обновление ObjectScript 2.4-rc!!!
Что нового?
Если опустить пару десятков др. обновлений, о которых тут не было написано, то в 2.4-rc при создании новой функции, она автоматически привязываются не только к текущему окружению (область видимости глобальных переменных для функции), но и к текущему this. Функция получает этот this, если вызывается НЕ как метод объекта, а как просто функция сохраненную в переменную.
Как это понимать и что это дает?
Сравним старый код и новый для ObjectScript 2.4-rc.
Старый вариант:
@addTimeout(2.5, function( ){ if( @state == "WAIT_BOLT_USED"){ @state = "GENERIC" @startPanelSwing( ) } }.bind( this))
В этом коде создается функция, которая будет вызвана через 2.5 секунды. Как видно, функции нужно иметь доступ к текущему экземпляру объекта (см. @state - это алиас для this.state). Для этого функция была принудительно привязана к this, обратите внимание на код "}.bind(this)".
Код для ObjectScript 2.4-rc (без bind):
@addTimeout(2.5, function( ){ if( @state == "WAIT_BOLT_USED"){ @state = "GENERIC" @startPanelSwing( ) } })
работает аналогично, т.к. по умолчанию функция сама привязалась к this. А как это выглядит для более впечатляющих примеров? Смотрите - это цепная реакция из кучи callback-ов, кот. вызываются при завершении действия и запускают следующее:
finger.replaceTweenAction {
name = "tutorial",
duration = 0.4,
opacity = 1,
doneCallback = function( ){
finger.addTimeout( 0.4, function( ){
finger.animateTouch( function( ){
finger.replaceTweenAction {
name = "tutorial",
duration = 2,
pos = params.endPos,
angle = params.endAngle,
ease = Ease.CUBIC_IN_OUT,
doneCallback = function( ){
finger.animateUntouch( function( ){
finger.addTimeout( 0.8, function( ){
finger.replaceTweenAction {
name = "tutorial",
duration = 0.3,
opacity = 0,
doneCallback = function( ){
finger.addTimeout( 3, function( ){
@animateDragFinger( params)
})
},
}
})
})
},
}
})
})
},
}Это реально работающий код из демки к движку OS2D. Раньше там везде стояли bind-ы, ссылка на исходник этого кода https://github.com/unitpoint/eXeXeXeX/blob/master/data/Tutorial.os#L49
Этот код двигает палец руки для обучения покупки, см. видео:

Старый вариант с bind-ом также работает, т.е. мы имеем полную обратную совместимость.
Это любопытно:
Функция bind, о которой тут упоминалось, не является чем-то заложенным в сам язык, она реализована на самом ObjectScript и выглядит следующим образом:
function delegate(self, func){ var args = ... if( #args == 0){ return function( ){ return func.apply( self, arguments) } } return function( ){ if( #arguments == 0){ return func.apply( self, args) } return func.apply( self, [].merge( args, arguments)) } } function Function.bind( self){ var args = ... if( #args == 0){ return delegate( self, this) } return delegate.apply( _E, [self, this].merge( args)) }
Function.bind - это она и есть, а находится это "чудо" тут https://github.com/unitpoint/eXeXeXeX/blob/master/data/os2d/std.os#L87
Вот такое полезное обновление в ObjectScript 2.4-rc.
Тема в архиве.