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

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

Страницы: 17 8 9 10 11 12 Следующая »
#135
16:11, 19 дек 2013

EvilSpirit
Спасибо за конструктивную критику!

Несколько фактов (больше наверное интересных):

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

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

А теперь самое интересное:

- в 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), чтобы они не помешали верстке:

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

P.S. конечно же виджет HtmlEncodeWidget реализован на самом же ObjectScript:

HtmlEncodeWidget = extends Widget {
        init = function(){
                super()
                ob.push()
        },
        run = function(){
                echo html.encode(ob.popContents())
        },
}
#136
11:48, 17 янв 2014

Pushkoff (ссылка на сообщение)
> лайкнул на гитхабе. сразу писал все в одном файле или склеивал тулзой?

О, вот за это спасибо огромное!

Делал все в одном файле, мне так удобнее. Например, опубликованная моя мобильная игра Где мой дом? (opensource) тоже написана в таком стиле (см. MonsterHome.cpp).

#137
21:11, 17 янв 2014

UnitPoint
мне больше нравится куча файлов поменьше и со смыслом, но когда работаю с чужими либами - намного приятнее включить в проект один файл и не париться с компиляцией библиотек, линковкой хидерами и прочим. на гитхабе есть проект amalgamation который делает приблизительно такой же файл как релизы sqlite или lemon.
думал может у тебя какой-то свой специфический способ

#138
22:21, 17 янв 2014

Pushkoff
> мне больше нравится куча файлов поменьше и со смыслом, но когда работаю с
> чужими либами - намного приятнее включить в проект один файл и не париться с
> компиляцией библиотек, линковкой хидерами и прочим.
+1
я в своих проектах делаю хедер с инклудами всех cpp файлов и подключаю его в cpp файле, получается много маленьких файлов и удобно подключать.

#139
10:16, 18 янв 2014

Pushkoff
> но когда работаю с чужими либами - намного приятнее включить в проект один файл
> и не париться с компиляцией библиотек
+ 100500!

Особенно когда мультиплатформа, и туже самую библу нужно компилить много раз - ад
Хороший пример, по мойму это pugi xml

#140
16:41, 18 янв 2014

Кстати судя по сайту OS - теперь это движек для сайтов, а не скриптовый для игр

#141
19:57, 1 мар 2014

Не совсем. Веб-разработка - это один из примеров использования ObjectScript, который построен на os-fcgi (opensource) - реализация протокола FastCGI и использование скриптового языка ObjectScript для исполнения сценариев.

За последнее время ObjectScript обзавелся множеством дополнений и улучшений. Наконец-то реализованы операторы +=, -= и др. подобные, операторы ++/-- теперь работают не только для локальных переменных, а и для свойств объектов и элементов массивов, добавлен дополнительный (пятый) синтаксис для описания строковых констант без слеширования символов

`/\d+\.*/`

(такую запись очень удобно использовать, например, для описания регулярных выражений) и мн. др.

#142
20:26, 1 мар 2014

Было бы не плохо добавить всяких штук из функциональных языков, матчинг аля эрланг, корутины и т.д, если еще нет, конечно, генераторы списков

#143
12:42, 2 мар 2014

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.

Прошло более 6 месяцев
#144
12:23, 5 сен 2014

Помнится, спрашивали про игровые демки на ObjectScript, такое появилось (буквально в соседней теме). см. OS2D engine - 2d мобильные игры на языке ObjectScript. Там есть и видео и откомпилированная прога для попробовать, а также полные исходники.

#145
13:52, 5 сен 2014

У вас случаем не упростилось API загрузки байт кода скриптов из памяти? Последний раз, когда смотрел, требовалось перекрывать кучу методов. И кажется были проблемы с иcпользованием int и bitwise операторов.

#146
16:51, 5 сен 2014

PsychoMan
Вы можете начать использовать ObjectScript, размещая скрипты в файле(ах). Это подходит для большинства случаев, в том числе при программировании мобильных игр. С этого можно начать, а далее уверен, что не решаемых проблем нет, я помогу.

С int и bitwise работает все аналогично JavaScript. Кроме этого ObjectScript позволяет создавать пользовательские классы и перегружать операторы, что можно использовать при разработке специальных классов, например, BigNumber и работать с ними как с обычными числами.

В движке OS2D используется vec2 (точка x, y), который реализован полностью на ObjectScript, см. vec2.os

#147
18:31, 5 сен 2014

UnitPoint
Молоток, если потеснишь js и cofee script хотя бы частично это будет большая удача!
А как если не секрет реализована работа OS на стороне клиента? То есть там где и JS работает?

#148
19:16, 10 сен 2014

ObjectScript - это в первую очередь очень легкий встраиваемый язык в программы на C++. Также готов веб-фреймворк для разработки на OS, в замен PHP, например. Пример его использования - сайт http://objectscript.org , который сам написан на ObjectScript.

#149
19:34, 7 окт 2014

Вышло обновление 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.

Страницы: 17 8 9 10 11 12 Следующая »
ПроектыФорумОцените

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