Oberon space

General Category => Общий раздел => Тема начата: Ivan Denisov от Январь 04, 2017, 07:24:59 pm

Название: OberonJS
Отправлено: Ivan Denisov от Январь 04, 2017, 07:24:59 pm
Всех с Новым Годом!

Вопрос к Алексею по OberonJS. На первом Дне Оберона я сильно вдохновился вашим компилятором в плане разработки демонстрационных графических моделей. Мы помню, обсуждали, что возможно сделать несложную демонстрацию как использовать компилятор для создания контекста для рисования и рисования на нем несложных рисунков с текстами.

Алексей, если у тебя будет время на это, то я прошу провести для меня такой мастер-класс. Мы можем записать по итогу какую-то демку на видео, если хочешь.
Название: Re: OberonJS
Отправлено: Valery Solovey от Январь 05, 2017, 09:00:32 pm
Транслятор разрабатывал vlad2.
Название: Re: OberonJS
Отправлено: vlad от Январь 06, 2017, 12:19:05 am
Транслятор разрабатывал vlad2.

Тем не менее, valexey главный по PR ;) И демки у него хорошо получались. Применительно к графике valexey скрещивал oberonjs с http://processingjs.org/.
Название: Re: OberonJS
Отправлено: valexey_u от Январь 06, 2017, 11:31:11 am
Я пока в местах, где с интернетом туго, окончательно вернусь примерно через неделю.

А так да, можно будет провести мастер-класс.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Январь 06, 2017, 08:09:40 pm
Я пока в местах, где с интернетом туго, окончательно вернусь примерно через неделю.

А так да, можно будет провести мастер-класс.
Ну тогда через недельку напишу, надо накидать пару примеров. На самом деле у компилятора большая ниша в области образования и науки. По сути у него нет альтернатив... Но надо дописать правильные обертки над графической частью и сделать несколько демонстраций.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Январь 21, 2017, 06:46:06 pm
Влад и Алексей, сделайте хотя бы минимальную документацию.
Я просто не понимаю как пользоваться компилятором.

Алексей, выложи демки свои с Дня Оберона?

https://youtu.be/KlHMOCbmtf0?t=19m51s
Название: Re: OberonJS
Отправлено: vlad от Январь 22, 2017, 04:55:33 pm
Влад и Алексей, сделайте хотя бы минимальную документацию.
Я просто не понимаю как пользоваться компилятором.

Минимальная там есть, вполне в духе оберона :) У тебя build.py заработал? _out/os.js собрался? Ты его в каком виде хочешь использовать? На вебе или вместе с Node.js?
Название: Re: OberonJS
Отправлено: Ivan Denisov от Январь 23, 2017, 04:01:25 pm
Я почти разобрался и даже нашел примеры с канвасами тут на форуме.

Вопрос. Как скомпилированный код, загрузить в HTML для повторного использования?

Вот начал делать образовательный проект по биофизическим моделям.
http://molpit.org/models

Начинаю с разработки модуля Log.
http://molpit.org/models/Log.js

require("Log.js"); не помогает
<script src="Log.js"></script>тоже

Название: Re: OberonJS
Отправлено: Valery Solovey от Январь 23, 2017, 05:29:22 pm
у меня работает
<html>
<head><script src="Log.js"></script></head>
<body onLoad="this.Log.String('yyy');">
<div id="log"></div>
</body>
</html>
Название: Re: OberonJS
Отправлено: vlad от Январь 23, 2017, 05:39:43 pm
Я почти разобрался и даже нашел примеры с канвасами тут на форуме.

Вопрос. Как скомпилированный код, загрузить в HTML для повторного использования?

Вот начал делать образовательный проект по биофизическим моделям.
http://molpit.org/models

Начинаю с разработки модуля Log.
http://molpit.org/models/Log.js

require("Log.js"); не помогает
<script src="Log.js"></script>тоже

Не очень понял, попробую угадать, что ты хочешь:
- скомпилировать обероновский модуль (Log) в js.
- импортировать скомпилированный модуль из HTML, чтобы скомпилировать еще один обероновскм
Название: Re: OberonJS
Отправлено: vlad от Январь 23, 2017, 05:48:42 pm
Я почти разобрался и даже нашел примеры с канвасами тут на форуме.

Вопрос. Как скомпилированный код, загрузить в HTML для повторного использования?

Вот начал делать образовательный проект по биофизическим моделям.
http://molpit.org/models

Начинаю с разработки модуля Log.
http://molpit.org/models/Log.js

require("Log.js"); не помогает
<script src="Log.js"></script>тоже

Не очень понял, попробую угадать, что ты хочешь:
- скомпилировать обероновский модуль (Log) в js.
- импортировать скомпилированный модуль из HTML, чтобы скомпилировать еще один обероновский модуль из текста ввведенного на этой HTML

Если это так, то в таком виде оно сейчас не поддерживается. Точнее не поддерживается импорт уже скомпиленных модулей. Поэтому для твоего (предполагаемого) случая это будет работать так:
- все импортируемые модули доступны в исходном обероне
- компилятор конфигурится так, что знает где достать модуль, когда встретит очередной импорт. При этом импортируемый модуль компилируется "на лету".
- на выходе получается один большой js, который и запускается после компиляции всего.
Название: Re: OberonJS
Отправлено: vlad от Январь 23, 2017, 05:56:05 pm
Читать импортируемые модули примерно так: https://github.com/vladfolts/oberonjs/blob/master/src/nodejs.js#L67
return oc.compileModules(
            sources,

            // вот эта функция по имени импортируемого модуля должна вернуть его исходный текст
            function(name){
                var fileName = name;
                if (!path.extname(fileName).length)
                    fileName += ".ob";
               
                readPath = calcPath(fileName);
                return fs.readFileSync(readPath, "utf8");
            },
...

"fs.readFileSync" в браузере нет (как и вообще доступа к файловой системе, это nodejs), тебе придется заменить его на что-то другое.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Январь 23, 2017, 06:39:40 pm
Спасибо за советы. Попробую сделать как Владислав написал, чтобы сохраненные готовые модули (фреймворк) копировались в начало рекурсивно.
Название: Re: OberonJS
Отправлено: vlad от Январь 23, 2017, 07:37:50 pm
Спасибо за советы. Попробую сделать как Владислав написал, чтобы сохраненные готовые модули (фреймворк) копировались в начало рекурсивно.

На самом деле еще проще: запихни все библиотечные модули текстуально до компилируемого и все заработает без бубнов с настройкой компилятора. Т.е.:
oc.compile(libModulesText + userEnteredText);

Несколько неэстетично, зато дешево надежно и практично.

P.S. Порядок модулей в тексте должен быть строго в порядке зависимостей.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Январь 23, 2017, 08:24:34 pm
Пока примерно так и сделал:
http://model.molpit.org/model/49
Демка работает.

Но задумка несколько шире. Чтобы пользователь для каждой модели смог свой фреймворк дорабатывать.

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

Модули хранятся а базе данных. Сделал уже, но пока без сохранения. Только Log положил в базу данных.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Январь 24, 2017, 06:17:55 am
Влад, к тебе первая просьба:

можешь поправить, чтобы компилятор обнаруживал пропущенные точки с запятой?

сейчас он создает код, и потом во время исполнения уже выдает ошибку.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Январь 24, 2017, 06:20:17 am
А нет, он обнаруживает... но из-за того, что сверху приклеены другие модули, он неправильно строку показывает :)

Придется вычислять сдвиг и корректировать сообщения об ошибке.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Январь 24, 2017, 06:28:09 am
Рекомендую модераторам таки выделить форум по OberonJS из общего раздела. Это все-таки какой-то продукт. Тогда и ссылку можно будет давать людям, мол проект обсуждается с разработчиком там то.
Название: Re: OberonJS
Отправлено: vlad от Январь 24, 2017, 05:13:43 pm
А нет, он обнаруживает... но из-за того, что сверху приклеены другие модули, он неправильно строку показывает :)

Придется вычислять сдвиг и корректировать сообщения об ошибке.

Я бы все-таки предложил сделать по-правильному - чтение импортируемого модуля "on demand". Тогда не будет таких проблем. Мне кажется это не должно быть проблемой. Для HTML это будет что-то типа <script> секций, указывающих на исходные файлы модулей, oc.compile будет вытаскивать текст из соответствующей секции. Я могу помочь ближе к воскресенью, если у тебя не получится.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Январь 27, 2017, 08:30:17 am
Немного продвинулся, почти доделал некий менеджер модулей.
http://models.molpit.org/model/49
Возможно менять несколько модулей и потом компилировать. И также к модулям возможно добавлять документацию.
Надо теперь будет сделать, чтобы модули автоматически выстаивались в правильном порядке при компиляции.
Название: Re: OberonJS
Отправлено: vlad от Январь 27, 2017, 06:16:04 pm
Немного продвинулся, почти доделал некий менеджер модулей.
http://models.molpit.org/model/49

Выглядит прикольно. А что в итоге будет и для кого?

Возможно менять несколько модулей и потом компилировать. И также к модулям возможно добавлять документацию.
Надо теперь будет сделать, чтобы модули автоматически выстаивались в правильном порядке при компиляции.

Еще раз - надо делать on demand подгрузку, тогда такой проблемы не будет - оно естественным образом будет выстраиваться.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Январь 27, 2017, 07:45:36 pm
Ну там может быть сложный граф зависимостей достаточно.... Например А, зависит от B, и С, но C, зависит от B, тогда получается, что сначала надо импортировать B, потом С, а потом А.  То есть все равно надо иметь все импорты, и потом строить очередь модулей. Или я не прав? Возможно все в произвольном порядке компилировать?
Название: Re: OberonJS
Отправлено: Ivan Denisov от Январь 27, 2017, 07:49:34 pm
Немного продвинулся, почти доделал некий менеджер модулей.
http://models.molpit.org/model/49

Выглядит прикольно. А что в итоге будет и для кого?

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

Но теперь я вижу, что тут же возможно портировать компилятор Александра для ARM. И тогда возможно будет программировать прошивки для микроконтроллеров онлайн. Это уже новая интересная задача в духе современных онлайн САПР.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 03, 2017, 04:49:24 pm
Влад, а насколько легко сделать так, чтобы единицей компиляции был все таки модуль, а не множество модулей?
У тебя там как-то все монолитно сделано? Возможно ли использовать как-то трансилированные ранее модули?
Название: Re: OberonJS
Отправлено: vlad от Февраль 07, 2017, 05:16:24 am
Влад, а насколько легко сделать так, чтобы единицей компиляции был все таки модуль, а не множество модулей?
У тебя там как-то все монолитно сделано? Возможно ли использовать как-то трансилированные ранее модули?

Сделано по виртовской классике - мухи с котлетами, компиляция и генерация кода в один проход. Следующий запланированный этап это как раз распил монолита на несколько проходов с промежуточным представлением, которое можно сериализовать как "скомпилированный модуль".
У тебя какая-то реальная техническая проблема или просто не кошерно?
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 07, 2017, 07:34:16 am
Техническая проблема с номерами строк. Решение сейчас сделал в виде парсинга ответа твоего компилятора и вычета числа строк базовых модулей. Но это такой костылище :)
if (errors != null & errors != '') {
var errArray = errors.match(/(line) ([0-9]+)(:*)/);
document.getElementById('compileErrors').textContent = errors.replace(/(line) ([0-9]+)(:*)/, "line ("+ (errArray[2] - prelen) + ") $3" );
} else {
document.getElementById('compileErrors').textContent = '';
}
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 07, 2017, 08:08:08 am
Сделал примерчик для математики.
https://models.molpit.org/model/52

Помогите, пожалуйста, разобраться со шрифтами! Как нарисовать текст?
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 07, 2017, 08:12:24 am
В целом альфа версия сайта готова :)
Регистрируйтесь, чтобы протестировать и написать замечания по редактору.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 07, 2017, 08:20:48 am
Правда пока так и не сделал правильный разбор импорта, поэтому пока желательно ограничиваться одним модулем на модель. Модуль лучше назвать Init.
Название: Re: OberonJS
Отправлено: vlad от Февраль 07, 2017, 03:13:47 pm
Помогите, пожалуйста, разобраться со шрифтами! Как нарисовать текст?

Раз уж ты связался с processing.js, то вот это не подходит? http://processingjs.org/reference/text_
Название: Re: OberonJS
Отправлено: vlad от Февраль 07, 2017, 03:21:03 pm
Техническая проблема с номерами строк. Решение сейчас сделал в виде парсинга ответа твоего компилятора и вычета числа строк базовых модулей. Но это такой костылище :)

Дык, я ж тебе говорил, что надо плагнутся в чтение модулей - у тебя и проблема с нумерацией уйдет и проблема с правильными зависимостями. Прямо сейчас не могу посмотреть, только на выходных.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 07, 2017, 04:41:56 pm
Помогите, пожалуйста, разобраться со шрифтами! Как нарисовать текст?

Раз уж ты связался с processing.js, то вот это не подходит? http://processingjs.org/reference/text_
Я пытался сделать как там, но не понимаю как правильно объявить глобальную переменную
PFont font;
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 07, 2017, 04:43:27 pm
Техническая проблема с номерами строк. Решение сейчас сделал в виде парсинга ответа твоего компилятора и вычета числа строк базовых модулей. Но это такой костылище :)

Дык, я ж тебе говорил, что надо плагнутся в чтение модулей - у тебя и проблема с нумерацией уйдет и проблема с правильными зависимостями. Прямо сейчас не могу посмотреть, только на выходных.
С нетерпением буду ждать. Боюсь, что без твоей помощи с глубоким пониманием собственного транслятора, мое решение будет всегда костыльным.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 07, 2017, 04:44:36 pm
Алексей, а у меня к тебя огромная просьба. Не мог бы ты зарегистрироваться на моем сайте, чтобы я от тебя разместил твои же примеры. А то так получается, что они от моего юзера. А лучше бы от твоего сделать, раз ты автор!
Название: Re: OberonJS
Отправлено: vlad от Февраль 07, 2017, 06:40:22 pm
Я пытался сделать как там, но не понимаю как правильно объявить глобальную переменную
PFont font;

Я так понял эта штука пришла из Java и примеры тоже оттуда ;) Поэтому надо допиливать напильником. В JavaScript нет типов при объявлении переменной, поэтому будет просто:
var font;
Название: Re: OberonJS
Отправлено: vlad от Февраль 07, 2017, 06:43:34 pm
С нетерпением буду ждать. Боюсь, что без твоей помощи с глубоким пониманием собственного транслятора, мое решение будет всегда костыльным.

Оно у тебя есть в виде исходников на каком-нибудь гитхабе? А то я боюсь готового html будет мало...
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 08, 2017, 03:49:59 am
С нетерпением буду ждать. Боюсь, что без твоей помощи с глубоким пониманием собственного транслятора, мое решение будет всегда костыльным.

Оно у тебя есть в виде исходников на каком-нибудь гитхабе? А то я боюсь готового html будет мало...
Дело в том, что все примеры сейчас в базе данных хранятся, при загрузке они в виде переменных записываются в HTML. Так что тут не так просто выложить в GitHub весь проект. А зачем тебе доступ к PHP ? Там ведь на уровне JavaScript у тебя вся логика компилирования.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 08, 2017, 03:50:54 am
Я так понял эта штука пришла из Java и примеры тоже оттуда ;) Поэтому надо допиливать напильником. В JavaScript нет типов при объявлении переменной, поэтому будет просто:
var font;
Спасибо, попробую так.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 09, 2017, 08:20:41 am
Подскажите, пожалуйста, как отключить добавление пробелов при переходе на новую строку?!?!
Название: Re: OberonJS
Отправлено: vlad от Февраль 09, 2017, 02:46:22 pm
Подскажите, пожалуйста, как отключить добавление пробелов при переходе на новую строку?!?!

Ты про редактор? Это надо спрашивать/смотреть где-то здесь: https://codemirror.net/doc/manual.html
Название: Re: OberonJS
Отправлено: vlad от Февраль 12, 2017, 06:59:56 am
С нетерпением буду ждать. Боюсь, что без твоей помощи с глубоким пониманием собственного транслятора, мое решение будет всегда костыльным.

Вот мой "глубокий" коммит: https://github.com/vladfolts/oberonjs/commit/e25413ba63621ccd68997b0760e49106bfb77046
Запулай его и тогда сможешь у себя написать так (см. main.js):
result = require('oc.js').compile(
src,
language,
function(e){errors += e;},
options,
                        readModule // функция чтения импортируемого модуля
)

readModule() будет выглядет так:
function readModule(name){
    return modules[name];
}

Ну и модули будут задаваться примерно так:
var modules = {
    Log: "MODULE Log;...",
    Draw: "MODULE Draw;...
    ....
};

Все извращения с конкатенацией текста модулей убери.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 12, 2017, 06:47:15 pm
Спасибо, Влад, на неделе испробую это полезное нововведение.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 15, 2017, 02:33:50 am
Все работает как надо, спасибо, Влад.

Теперь пользователь сможет делать произвольное число модулей для своих приложений :)
https://models.molpit.org/model/63
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 15, 2017, 02:50:54 am
Упс, не все работает.
TypeError: internal compiler error while parsing line 2: self.s is undefinedhttps://models.molpit.org/model/52

Как это поправить?
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 15, 2017, 02:59:10 am
добавление префиксов к именам модулей в переменных JavaScript не помогло :(
Название: Re: OberonJS
Отправлено: vlad от Февраль 15, 2017, 06:14:28 am
Упс, не все работает.
TypeError: internal compiler error while parsing line 2: self.s is undefinedhttps://models.molpit.org/model/52

Как это поправить?

У меня оно падает с "moduleLog is not defined" в main.js:273.
Ты в курсе отладочных средств в браузере? F12 + break on exceptions и вперед :)
Название: Re: OberonJS
Отправлено: vlad от Февраль 15, 2017, 06:15:04 am
добавление префиксов к именам модулей в переменных JavaScript не помогло :(

Какие префиксы? Зачем?
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 15, 2017, 07:22:00 am
У меня нет клавиши Break не клавиатуре :(
Я сделал префиксы mod и doc, поскольку подумал, что проблема в том, что стандартная библиотека JavaScript называется Math. Именно с этим модулем Math проблема. Если его закомментировать то этот модуль нормально компилируется.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 15, 2017, 07:22:45 am
А у тебя похоже moduleLog не может найти, поскольку в кэше старый main.js. Обнови страницу, пожалуйста.
Название: Re: OberonJS
Отправлено: vlad от Февраль 15, 2017, 04:02:17 pm
А у тебя похоже moduleLog не может найти, поскольку в кэше старый main.js. Обнови страницу, пожалуйста.

Я пробовал F5 не помогало, на другом компе обновило. Тебе надо поправить вот эту функцию:
function readModule(name){
    return modules['mod'+name];
}

Во-первых, кидай исключение если модуль с именем name не найден. JS так просто исключения не кидает, поэтому это все падает много позже в непонятном месте.

Во-вторых, поскольку компилятор пытается избежать конфликтов со стандартными JS классами, то для Math модуля name будет 'Math$'. Пока можешь сделать костыль типа:
function readModule(name){
    if (name == "Math$" )
        name = "Math";
    return modules['mod'+name];
}

В-третьих, создай issue на гитхабе :) Я его фиксну - имя в читатель модулей должно приходить оригинальное - 'Math'.

В-четвертых, таки нажми F12 и посмотри, что там есть для отладки. Убогость языка компенсируется неплохим дебаггером в любом популярном браузере: Chrome, IE, FireFox, Safari.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 15, 2017, 04:18:21 pm
Создал тебе issue на GitHub. А обновлять надо с Ctrl+F5, чтобы весь кэш обновился.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 16, 2017, 12:42:21 pm
Вот такой еще вопрос.

PROCEDURE Sin* (x: REAL): REAL;
  VAR res: REAL;
BEGIN
JS.do("res = Math.sin(x)");
RETURN res
END Sin;

Возможно ли вернуть результат без создания переменной res?

Например так как-то сделать возможно?
PROCEDURE Sin* (x: REAL): REAL;
BEGIN
RETURN JS.doReturn("Math.sin(x)")
END Sin;
Название: Re: OberonJS
Отправлено: vlad от Февраль 16, 2017, 03:02:04 pm
Возможно ли вернуть результат без создания переменной res?

В текущей реализации нельзя. Можно сделать что-то типа "JS.cast(value, type)". Как там принято в обероновском SYSTEM - SYSTEM.VAL?
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 17, 2017, 12:46:34 am
Возможно ли вернуть результат без создания переменной res?

В текущей реализации нельзя. Можно сделать что-то типа "JS.cast(value, type)". Как там принято в обероновском SYSTEM - SYSTEM.VAL?
А в качестве value нельзя будет подставить "Math.sin(x)" ?

Дополнительные переменные, это ведь получается лишние затраты на оперативную память. Лучше сразу вернуть значение как-то.
Название: Re: OberonJS
Отправлено: vlad от Февраль 17, 2017, 06:18:40 am
А в качестве value нельзя будет подставить "Math.sin(x)" ?

Можно и так сделать.

Цитата: Ivan Denisov
Дополнительные переменные, это ведь получается лишние затраты на оперативную память. Лучше сразу вернуть значение как-то.

Этого нельзя предположить для современного JS движка. Скорее всего в данном случае код с дополнительной переменной будет оптимизирован так же как и без. Эта фича имеет смысл только для того, чтобы биндинги проще писать было.
Название: Re: OberonJS
Отправлено: vlad от Февраль 18, 2017, 07:31:21 am
Создал тебе issue на GitHub. А обновлять надо с Ctrl+F5, чтобы весь кэш обновился.

Фикснул. Но возможно еще будут какие-то похожие штуки вылазить - сообщай плз.
А с кэшем надо что-то делать - иначе у других пользователей такая же проблема будет.
Название: Re: OberonJS
Отправлено: Valery Solovey от Февраль 18, 2017, 10:13:31 am
Можно заголовки у страницы настроить.
<meta http-equiv="Cache-Control" content="no-cache">

Или заголовки у http-ответа указать.
Название: Re: OberonJS
Отправлено: Geniepro от Февраль 18, 2017, 08:31:08 pm
Вот такой еще вопрос.

PROCEDURE Sin* (x: REAL): REAL;
  VAR res: REAL;
BEGIN
JS.do("res = Math.sin(x)");
RETURN res
END Sin;

Возможно ли вернуть результат без создания переменной res?

А если вот так:
PROCEDURE Sin* (x: REAL): REAL;
BEGIN
JS.do("return Math.sin(x)");
END Sin;
Название: Re: OberonJS
Отправлено: akron1 от Февраль 18, 2017, 09:10:20 pm
Geniepro,
Правила O7 требуют, чтобы процедура-функция заканчивалась на "RETURN expression".
Можно так:
PROCEDURE Sin* (x: REAL): REAL;
BEGIN
  JS.do("return Math.sin(x)")
  RETURN 0.0
END Sin;

Из-за этой особенности мне тоже иногда приходится использовать фиктивный RETURN, который никогда не выполняется:
PROCEDURE [stdcall] sysfunc1*(arg1: INTEGER): INTEGER;
BEGIN
  sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
  sys.CODE("CD40");             (* int     40h              *)
  sys.CODE("C9");               (* leave                    *)
  sys.CODE("C20400");           (* ret     04h              *)
  RETURN 0
END sysfunc1;
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 20, 2017, 03:10:01 pm
Можно заголовки у страницы настроить.
<meta http-equiv="Cache-Control" content="no-cache">

Или заголовки у http-ответа указать.
Это плохая идея, так как компилятор пол мегабайта весит :)
Название: Re: OberonJS
Отправлено: vlad от Февраль 20, 2017, 03:40:07 pm
Это плохая идея, так как компилятор пол мегабайта весит :)

Ты так говоришь, как будто пол гигабайта ;) Я не специалист в Web и не знаю как такие проблемы решаются правильно с текущими технологиями, но одно из существующих/проверенных решений это добавление хэша к имени файла скрипта. Естественное это подразумевает какую-то автоматизацию сборки сайта.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 21, 2017, 09:09:27 am
Создал тебе issue на GitHub. А обновлять надо с Ctrl+F5, чтобы весь кэш обновился.

Фикснул. Но возможно еще будут какие-то похожие штуки вылазить - сообщай плз.
А с кэшем надо что-то делать - иначе у других пользователей такая же проблема будет.
Спасибо, обновил компилятор. Вот еще проблема есть. Не понимаю почему в режиме публикации зависает скрипт...
https://models.molpit.org/ready/52
В режиме редактирования все нормально работает при этом. И дерево нормально работает:
https://models.molpit.org/ready/51
Такое ощущение, что проблема возникает с теми модулями, где используются шрифты.

С кэшем кажется была проблема из-за такого конфига сервера:
        location ~* \.(html|jpg|jpeg|gif|png|ico|css|js)$ {
                expires       30d;
                add_header    Cache-Control public;
        }

Закомментировал пока эти инструкции.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 21, 2017, 09:31:04 am
С проблемой зависания вроде разобрался, не совсем корректно передаю JS через ajax. Поэтому ++ в цикле пропал.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 21, 2017, 12:18:23 pm
Ох уж эти web технологии. Стоит добавить букву o или число Пи, как программы перестают нормально кодироваться в base64.

Может кто-то знает метод?!

Пока лучшее, что я нашел это вот такая функция.
function b64EncodeUnicode(str) {
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
        return String.fromCharCode('0x' + p1);
    }));
}
Название: Re: OberonJS
Отправлено: vlad от Февраль 21, 2017, 02:26:31 pm
Может кто-то знает метод?!

Ты гуглил? ;) Из общих соображений и для проверки правильного понимания концепций: base64 это кодировка для бинарей, перед тем как ее использовать надо текст перегнать в бинарь, чтобы текст перегнать в бинарь надо определиться в какой кодировке будет этот текст будучи в бинаре (UTF8?).
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 21, 2017, 03:05:47 pm
Может кто-то знает метод?!

Ты гуглил? ;) Из общих соображений и для проверки правильного понимания концепций: base64 это кодировка для бинарей, перед тем как ее использовать надо текст перегнать в бинарь, чтобы текст перегнать в бинарь надо определиться в какой кодировке будет этот текст будучи в бинаре (UTF8?).
Да, много часов потратил на эти поиски. UTF8 подойдет, да.

encodeURIComponent как раз вроде перегоняет в бинарь.
http://ecmanaut.blogspot.ru/2006/07/encoding-decoding-utf8-in-javascript.html
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 21, 2017, 03:12:19 pm
вот так заработало!

function b64EncodeUnicode(str) {
    return btoa(unescape(encodeURIComponent(str)));
}

Сейчас еще проверю на задачке Дагаева.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 21, 2017, 03:13:19 pm
Не работает все равно :(

function Draw(){
D.SetFont("Times New Roman");
D.String("Это высказывание ложно", 50, 100, 40);
D.String("ЭтЈ4,</script>
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 21, 2017, 03:49:42 pm
Вот вроде есть рецепт тут, и тоже не работает :(
https://scotch.io/tutorials/how-to-encode-and-decode-strings-with-base64-in-javascript
Название: Re: OberonJS
Отправлено: vlad от Февраль 21, 2017, 03:53:00 pm
вот так заработало!

Да, это типа рекомендованный способ. Видимо проблема где-то в другом месте.
Название: Re: OberonJS
Отправлено: vlad от Февраль 21, 2017, 04:10:08 pm
Вот эти две функции работают с русскими буквами и прочими пи в моем хроме:
function encode( s ) {
  return btoa( unescape( encodeURIComponent( s ) ) );
}
function decode( s ) {
  return decodeURIComponent( escape( atob( s ) ) );
}

encode("варпваπ");
"0LLQsNGA0L/QstCwz4A="

decode("0LLQsNGA0L/QstCwz4A=")
"варпваπ"
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 21, 2017, 04:21:42 pm
Мне кажется я перемудрил. Достаточно простого encodeURIComponent для кода и он нормально передается через ajax запрос... а опыт сегодняшнего дня с base64 забуду как страшный сон
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 21, 2017, 04:26:57 pm
Влад, а тут Comdiv интересовался, почему проверка индексов так много времени занимает?
Он пример накидал, что разница в 10 раз получается:
https://models.molpit.org/model/59
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 22, 2017, 12:52:00 am
Добавил обработчики мыши, получился слайдер
https://models.molpit.org/model/52

В целом осталось добавить базовые преобразователи, доработать модуль работы со строками и можно говорить про некую альфа-версию :-)
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 22, 2017, 02:21:26 am
Влад, я сделал модуль для базовых операций со строками. Но вот ASSERT когда срабатывает, нельзя ли указывать в какой он процедуре сработал?
Название: Re: OberonJS
Отправлено: vlad от Февраль 22, 2017, 05:42:24 am
Влад, а тут Comdiv интересовался, почему проверка индексов так много времени занимает?

Потому что не считать выход за границы ошибкой одно из многих идиотских решений в джаваскрипте :)

Он пример накидал, что разница в 10 раз получается:
https://models.molpit.org/model/59

Да, если есть тест на котором хорошо видно разницу - гляну.
Название: Re: OberonJS
Отправлено: vlad от Февраль 22, 2017, 02:20:16 pm
Добавил обработчики мыши, получился слайдер
https://models.molpit.org/model/52

Слайдер не работает на мобиле. А вот все остальное работает. Профит! :)
Название: Re: OberonJS
Отправлено: vlad от Февраль 22, 2017, 02:55:26 pm
Влад, я сделал модуль для базовых операций со строками. Но вот ASSERT когда срабатывает, нельзя ли указывать в какой он процедуре сработал?

Процедуру вытащить можно, но непонятно зачем, если тебе и так весь стек доступен - см. свойство "stack" у перехваченного исключения.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 22, 2017, 03:09:44 pm
Влад, я сделал модуль для базовых операций со строками. Но вот ASSERT когда срабатывает, нельзя ли указывать в какой он процедуре сработал?

Процедуру вытащить можно, но непонятно зачем, если тебе и так весь стек доступен - см. свойство "stack" у перехваченного исключения.
Погляжу, не знал про это свойство.
Название: Re: OberonJS
Отправлено: Valery Solovey от Февраль 22, 2017, 09:39:40 pm
Можно заголовки у страницы настроить.
<meta http-equiv="Cache-Control" content="no-cache">

Или заголовки у http-ответа указать.
Это плохая идея, так как компилятор пол мегабайта весит :)
Во-первых, сервер сжимает передаваемые данные (или его можно настроить, чтобы он сжимал). Так что это после распаковки будет пол мегабайта.
Во-вторых, есть <frame> и <iframe>. Как я понимаю, с их помощью можно разбить страницу на несколько частей, которые будут иметь свои заголовки. Но это надо проверить. У меня был где-то пример. Если найду, то сообщу.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Февраль 23, 2017, 09:10:35 am
Валерий, не парьтесь, проблема решена на стороне сервера. У меня были слишком агрессивные настройки кэширования. Теперь все ок.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Март 01, 2017, 04:05:22 am
Ну вот Валера Шипков и Дмитрий Дагаев добавили примеров тоже :)
У меня пока пауза по работе, но мне дали много рекомендаций как улучшить интерфейс для мобилы и для ПК. Так что в середине марта вернусь с новой силой к проекту.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Март 01, 2017, 04:07:24 am
Я не знаю подписан ли кто-то из вашей компании на мой новостной канал по Бэкбоксу и Оберону.
Если нет, то подписывайтесь, и предлагайте для него новости, при необходимости что-то осветить :)
https://t.me/BlackBoxOberon
Название: Re: OberonJS
Отправлено: Ivan Denisov от Март 19, 2017, 02:14:19 pm
Столкнулся с тем, что CHAR транслятор понимает как числа.
PROCEDURE Char*(arg: CHAR);
BEGIN
JS.do("document.getElementById('log').innerHTML = document.getElementById('log').innerHTML + arg")
END Char;

Выводятся числа...
Название: Re: OberonJS
Отправлено: Ivan Denisov от Март 19, 2017, 02:59:38 pm
Еще хочется понять как выполнять преобразования типов. Мне надо четыре байта переделать в INTEGER.
В вики написано:
No SYSTEM module
А как делать тогда?
Название: Re: OberonJS
Отправлено: vlad от Март 20, 2017, 01:27:29 am
Столкнулся с тем, что CHAR транслятор понимает как числа.

На это были причины. Для твоего случая надо просто сделать String.fromCharCode(arg)
Название: Re: OberonJS
Отправлено: Ivan Denisov от Март 20, 2017, 01:57:05 am
С преобразованием типов вроде разобрался, спасибо, Comdiv.

 PROCEDURE GetInt4(a: ARRAY OF CHAR; pos: INTEGER): INTEGER;
BEGIN
ASSERT(ORD(a[pos + 3]) < 128)
RETURN ORD(a[pos]) + (ORD(a[pos+1]) + (ORD(a[pos+2]) + ORD(a[pos+3]) * 0100H ) * 0100H) * 0100H
END GetInt4;

PROCEDURE GetInt2(a: ARRAY OF CHAR; pos: INTEGER): INTEGER;
BEGIN
ASSERT(ORD(a[pos + 1]) < 128)
RETURN ORD(a[pos]) + ORD(a[pos+1]) * 0100H
END GetInt2;
Название: Re: OberonJS
Отправлено: vlad от Март 20, 2017, 02:02:43 am
Еще хочется понять как выполнять преобразования типов. Мне надо четыре байта переделать в INTEGER.
В вики написано:
No SYSTEM module
А как делать тогда?

Модуль JS вместо SYSTEM. Но в твоем случае можно обойтись обычным обероном:
    result := b1 + LSL(b2, 8) + LSL(b3, 16) + LSL(b4, 24);
Название: Re: OberonJS
Отправлено: Ivan Denisov от Март 20, 2017, 02:04:56 am
Столкнулся с тем, что CHAR транслятор понимает как числа.

На это были причины. Для твоего случая надо просто сделать String.fromCharCode(arg)
Firefox почему-то ругается
String.fromCharCode is not a function
Название: Re: OberonJS
Отправлено: Ivan Denisov от Март 20, 2017, 02:24:40 am
Модуль JS вместо SYSTEM. Но в твоем случае можно обойтись обычным обероном:
    result := b1 + LSL(b2, 8) + LSL(b3, 16) + LSL(b4, 24);
Спасибо, попдправил
PROCEDURE GetInt4(a: ARRAY OF CHAR; pos: INTEGER): INTEGER;
BEGIN
  RETURN ORD(a[pos]) + LSL(ORD(a[pos+1]), 8) + LSL(ORD(a[pos+2]), 16) + LSL(ORD(a[pos+3]), 24)
END GetInt4;

  PROCEDURE GetInt2(a: ARRAY OF CHAR; pos: INTEGER): INTEGER;
BEGIN
  RETURN ORD(a[pos]) + LSL(ORD(a[pos+1]), 8)
END GetInt2;
Название: Re: OberonJS
Отправлено: Ivan Denisov от Март 20, 2017, 02:26:24 am
Еще прошу поделиться опытом, как быть с динамическими объектами. Скажем, если мне надо создать массив под данные из файла.
NEW нельзя получается, массивы объявить тоже только по константе возможно.
Только статические типы получается? То есть заранее делать огномный буфер под предполагаемый размер?
Или есть какие-то варианты?
Название: Re: OberonJS
Отправлено: vlad от Март 20, 2017, 03:04:16 am
Firefox почему-то ругается
String.fromCharCode is not a function

Должно быть. Вот мозилловская документация: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode

Приведи весь сгенеренный код или минимальный пример, где оно не работает.
Название: Re: OberonJS
Отправлено: vlad от Март 20, 2017, 03:12:30 am
Еще прошу поделиться опытом, как быть с динамическими объектами. Скажем, если мне надо создать массив под данные из файла.
NEW нельзя получается, массивы объявить тоже только по константе возможно.
Только статические типы получается? То есть заранее делать огномный буфер под предполагаемый размер?
Или есть какие-то варианты?

1. Eberon (я там сделал поддержку динамических массивов).
2. Системный модуль JS: Вызвать RTL$.makeArray c нужным размером.

Вообще если ты собрался что-то читать из файла, то тебе все равно без JS не обойтись. Там же в биндинге сделай и массив нужного размера.

По подводу "как с этим жить" тебе Info21 расскажет на oberoncore  8) По мне так никакого глубинного смысла в этом нет вообще - Вирт сэкономил в очередной раз на простоте компилятора при том, что динамические массивы ему все равно не нужны были для очередной задачи.
Название: Re: OberonJS
Отправлено: Ivan Denisov от Март 20, 2017, 10:43:51 am
Приведи весь сгенеренный код или минимальный пример, где оно не работает.
Вот погляди.
https://models.molpit.org/model/49
Название: Re: OberonJS
Отправлено: vlad от Март 20, 2017, 01:22:39 pm
https://models.molpit.org/model/49

У тебя глобальный String перекрывается твоей собственной функцией String. Обратиться к глобальному можно так: JS.String.fromCharCode
Название: Re: OberonJS
Отправлено: Ivan Denisov от Март 21, 2017, 05:50:36 am
https://models.molpit.org/model/49

У тебя глобальный String перекрывается твоей собственной функцией String. Обратиться к глобальному можно так: JS.String.fromCharCode
Спасибо! Поправил. Буду бдителен на этот счет впредь.