Oberon space
General Category => Общий раздел => Тема начата: Ivan Denisov от Январь 04, 2017, 07:24:59 pm
-
Всех с Новым Годом!
Вопрос к Алексею по OberonJS. На первом Дне Оберона я сильно вдохновился вашим компилятором в плане разработки демонстрационных графических моделей. Мы помню, обсуждали, что возможно сделать несложную демонстрацию как использовать компилятор для создания контекста для рисования и рисования на нем несложных рисунков с текстами.
Алексей, если у тебя будет время на это, то я прошу провести для меня такой мастер-класс. Мы можем записать по итогу какую-то демку на видео, если хочешь.
-
Транслятор разрабатывал vlad2.
-
Транслятор разрабатывал vlad2.
Тем не менее, valexey главный по PR ;) И демки у него хорошо получались. Применительно к графике valexey скрещивал oberonjs с http://processingjs.org/.
-
Я пока в местах, где с интернетом туго, окончательно вернусь примерно через неделю.
А так да, можно будет провести мастер-класс.
-
Я пока в местах, где с интернетом туго, окончательно вернусь примерно через неделю.
А так да, можно будет провести мастер-класс.
Ну тогда через недельку напишу, надо накидать пару примеров. На самом деле у компилятора большая ниша в области образования и науки. По сути у него нет альтернатив... Но надо дописать правильные обертки над графической частью и сделать несколько демонстраций.
-
Влад и Алексей, сделайте хотя бы минимальную документацию.
Я просто не понимаю как пользоваться компилятором.
Алексей, выложи демки свои с Дня Оберона?
https://youtu.be/KlHMOCbmtf0?t=19m51s
-
Влад и Алексей, сделайте хотя бы минимальную документацию.
Я просто не понимаю как пользоваться компилятором.
Минимальная там есть, вполне в духе оберона :) У тебя build.py заработал? _out/os.js собрался? Ты его в каком виде хочешь использовать? На вебе или вместе с Node.js?
-
Я почти разобрался и даже нашел примеры с канвасами тут на форуме.
Вопрос. Как скомпилированный код, загрузить в HTML для повторного использования?
Вот начал делать образовательный проект по биофизическим моделям.
http://molpit.org/models
Начинаю с разработки модуля Log.
http://molpit.org/models/Log.js
require("Log.js"); не помогает
<script src="Log.js"></script>тоже
-
у меня работает
<html>
<head><script src="Log.js"></script></head>
<body onLoad="this.Log.String('yyy');">
<div id="log"></div>
</body>
</html>
-
Я почти разобрался и даже нашел примеры с канвасами тут на форуме.
Вопрос. Как скомпилированный код, загрузить в HTML для повторного использования?
Вот начал делать образовательный проект по биофизическим моделям.
http://molpit.org/models
Начинаю с разработки модуля Log.
http://molpit.org/models/Log.js
require("Log.js"); не помогает
<script src="Log.js"></script>тоже
Не очень понял, попробую угадать, что ты хочешь:
- скомпилировать обероновский модуль (Log) в js.
- импортировать скомпилированный модуль из HTML, чтобы скомпилировать еще один обероновскм
-
Я почти разобрался и даже нашел примеры с канвасами тут на форуме.
Вопрос. Как скомпилированный код, загрузить в 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, который и запускается после компиляции всего.
-
Читать импортируемые модули примерно так: 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), тебе придется заменить его на что-то другое.
-
Спасибо за советы. Попробую сделать как Владислав написал, чтобы сохраненные готовые модули (фреймворк) копировались в начало рекурсивно.
-
Спасибо за советы. Попробую сделать как Владислав написал, чтобы сохраненные готовые модули (фреймворк) копировались в начало рекурсивно.
На самом деле еще проще: запихни все библиотечные модули текстуально до компилируемого и все заработает без бубнов с настройкой компилятора. Т.е.:
oc.compile(libModulesText + userEnteredText);
Несколько неэстетично, зато дешево надежно и практично.
P.S. Порядок модулей в тексте должен быть строго в порядке зависимостей.
-
Пока примерно так и сделал:
http://model.molpit.org/model/49
Демка работает.
Но задумка несколько шире. Чтобы пользователь для каждой модели смог свой фреймворк дорабатывать.
Есть базовый набор модулей. Есть пользовательский набор для ряда моделей, и есть набор для каждой модели.
Модули хранятся а базе данных. Сделал уже, но пока без сохранения. Только Log положил в базу данных.
-
Влад, к тебе первая просьба:
можешь поправить, чтобы компилятор обнаруживал пропущенные точки с запятой?
сейчас он создает код, и потом во время исполнения уже выдает ошибку.
-
А нет, он обнаруживает... но из-за того, что сверху приклеены другие модули, он неправильно строку показывает :)
Придется вычислять сдвиг и корректировать сообщения об ошибке.
-
Рекомендую модераторам таки выделить форум по OberonJS из общего раздела. Это все-таки какой-то продукт. Тогда и ссылку можно будет давать людям, мол проект обсуждается с разработчиком там то.
-
А нет, он обнаруживает... но из-за того, что сверху приклеены другие модули, он неправильно строку показывает :)
Придется вычислять сдвиг и корректировать сообщения об ошибке.
Я бы все-таки предложил сделать по-правильному - чтение импортируемого модуля "on demand". Тогда не будет таких проблем. Мне кажется это не должно быть проблемой. Для HTML это будет что-то типа <script> секций, указывающих на исходные файлы модулей, oc.compile будет вытаскивать текст из соответствующей секции. Я могу помочь ближе к воскресенью, если у тебя не получится.
-
Немного продвинулся, почти доделал некий менеджер модулей.
http://models.molpit.org/model/49
Возможно менять несколько модулей и потом компилировать. И также к модулям возможно добавлять документацию.
Надо теперь будет сделать, чтобы модули автоматически выстаивались в правильном порядке при компиляции.
-
Немного продвинулся, почти доделал некий менеджер модулей.
http://models.molpit.org/model/49
Выглядит прикольно. А что в итоге будет и для кого?
Возможно менять несколько модулей и потом компилировать. И также к модулям возможно добавлять документацию.
Надо теперь будет сделать, чтобы модули автоматически выстаивались в правильном порядке при компиляции.
Еще раз - надо делать on demand подгрузку, тогда такой проблемы не будет - оно естественным образом будет выстраиваться.
-
Ну там может быть сложный граф зависимостей достаточно.... Например А, зависит от B, и С, но C, зависит от B, тогда получается, что сначала надо импортировать B, потом С, а потом А. То есть все равно надо иметь все импорты, и потом строить очередь модулей. Или я не прав? Возможно все в произвольном порядке компилировать?
-
Немного продвинулся, почти доделал некий менеджер модулей.
http://models.molpit.org/model/49
Выглядит прикольно. А что в итоге будет и для кого?
Изначально это задумывалось как коллекция моделей для открытого учебника по биофизике, тут и численные методы и разные графические примеры, машина тьюринга будет и нейросети. Самые разные задачи.
Но теперь я вижу, что тут же возможно портировать компилятор Александра для ARM. И тогда возможно будет программировать прошивки для микроконтроллеров онлайн. Это уже новая интересная задача в духе современных онлайн САПР.
-
Влад, а насколько легко сделать так, чтобы единицей компиляции был все таки модуль, а не множество модулей?
У тебя там как-то все монолитно сделано? Возможно ли использовать как-то трансилированные ранее модули?
-
Влад, а насколько легко сделать так, чтобы единицей компиляции был все таки модуль, а не множество модулей?
У тебя там как-то все монолитно сделано? Возможно ли использовать как-то трансилированные ранее модули?
Сделано по виртовской классике - мухи с котлетами, компиляция и генерация кода в один проход. Следующий запланированный этап это как раз распил монолита на несколько проходов с промежуточным представлением, которое можно сериализовать как "скомпилированный модуль".
У тебя какая-то реальная техническая проблема или просто не кошерно?
-
Техническая проблема с номерами строк. Решение сейчас сделал в виде парсинга ответа твоего компилятора и вычета числа строк базовых модулей. Но это такой костылище :)
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 = '';
}
-
Сделал примерчик для математики.
https://models.molpit.org/model/52
Помогите, пожалуйста, разобраться со шрифтами! Как нарисовать текст?
-
В целом альфа версия сайта готова :)
Регистрируйтесь, чтобы протестировать и написать замечания по редактору.
-
Правда пока так и не сделал правильный разбор импорта, поэтому пока желательно ограничиваться одним модулем на модель. Модуль лучше назвать Init.
-
Помогите, пожалуйста, разобраться со шрифтами! Как нарисовать текст?
Раз уж ты связался с processing.js, то вот это не подходит? http://processingjs.org/reference/text_
-
Техническая проблема с номерами строк. Решение сейчас сделал в виде парсинга ответа твоего компилятора и вычета числа строк базовых модулей. Но это такой костылище :)
Дык, я ж тебе говорил, что надо плагнутся в чтение модулей - у тебя и проблема с нумерацией уйдет и проблема с правильными зависимостями. Прямо сейчас не могу посмотреть, только на выходных.
-
Помогите, пожалуйста, разобраться со шрифтами! Как нарисовать текст?
Раз уж ты связался с processing.js, то вот это не подходит? http://processingjs.org/reference/text_
Я пытался сделать как там, но не понимаю как правильно объявить глобальную переменную
PFont font;
-
Техническая проблема с номерами строк. Решение сейчас сделал в виде парсинга ответа твоего компилятора и вычета числа строк базовых модулей. Но это такой костылище :)
Дык, я ж тебе говорил, что надо плагнутся в чтение модулей - у тебя и проблема с нумерацией уйдет и проблема с правильными зависимостями. Прямо сейчас не могу посмотреть, только на выходных.
С нетерпением буду ждать. Боюсь, что без твоей помощи с глубоким пониманием собственного транслятора, мое решение будет всегда костыльным.
-
Алексей, а у меня к тебя огромная просьба. Не мог бы ты зарегистрироваться на моем сайте, чтобы я от тебя разместил твои же примеры. А то так получается, что они от моего юзера. А лучше бы от твоего сделать, раз ты автор!
-
Я пытался сделать как там, но не понимаю как правильно объявить глобальную переменную
PFont font;
Я так понял эта штука пришла из Java и примеры тоже оттуда ;) Поэтому надо допиливать напильником. В JavaScript нет типов при объявлении переменной, поэтому будет просто:
var font;
-
С нетерпением буду ждать. Боюсь, что без твоей помощи с глубоким пониманием собственного транслятора, мое решение будет всегда костыльным.
Оно у тебя есть в виде исходников на каком-нибудь гитхабе? А то я боюсь готового html будет мало...
-
С нетерпением буду ждать. Боюсь, что без твоей помощи с глубоким пониманием собственного транслятора, мое решение будет всегда костыльным.
Оно у тебя есть в виде исходников на каком-нибудь гитхабе? А то я боюсь готового html будет мало...
Дело в том, что все примеры сейчас в базе данных хранятся, при загрузке они в виде переменных записываются в HTML. Так что тут не так просто выложить в GitHub весь проект. А зачем тебе доступ к PHP ? Там ведь на уровне JavaScript у тебя вся логика компилирования.
-
Я так понял эта штука пришла из Java и примеры тоже оттуда ;) Поэтому надо допиливать напильником. В JavaScript нет типов при объявлении переменной, поэтому будет просто:
var font;
Спасибо, попробую так.
-
Подскажите, пожалуйста, как отключить добавление пробелов при переходе на новую строку?!?!
-
Подскажите, пожалуйста, как отключить добавление пробелов при переходе на новую строку?!?!
Ты про редактор? Это надо спрашивать/смотреть где-то здесь: https://codemirror.net/doc/manual.html
-
С нетерпением буду ждать. Боюсь, что без твоей помощи с глубоким пониманием собственного транслятора, мое решение будет всегда костыльным.
Вот мой "глубокий" коммит: 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;...
....
};
Все извращения с конкатенацией текста модулей убери.
-
Спасибо, Влад, на неделе испробую это полезное нововведение.
-
Все работает как надо, спасибо, Влад.
Теперь пользователь сможет делать произвольное число модулей для своих приложений :)
https://models.molpit.org/model/63
-
Упс, не все работает.
TypeError: internal compiler error while parsing line 2: self.s is undefined
https://models.molpit.org/model/52
Как это поправить?
-
добавление префиксов к именам модулей в переменных JavaScript не помогло :(
-
Упс, не все работает.
TypeError: internal compiler error while parsing line 2: self.s is undefined
https://models.molpit.org/model/52
Как это поправить?
У меня оно падает с "moduleLog is not defined" в main.js:273.
Ты в курсе отладочных средств в браузере? F12 + break on exceptions и вперед :)
-
добавление префиксов к именам модулей в переменных JavaScript не помогло :(
Какие префиксы? Зачем?
-
У меня нет клавиши Break не клавиатуре :(
Я сделал префиксы mod и doc, поскольку подумал, что проблема в том, что стандартная библиотека JavaScript называется Math. Именно с этим модулем Math проблема. Если его закомментировать то этот модуль нормально компилируется.
-
А у тебя похоже moduleLog не может найти, поскольку в кэше старый main.js. Обнови страницу, пожалуйста.
-
А у тебя похоже 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.
-
Создал тебе issue на GitHub. А обновлять надо с Ctrl+F5, чтобы весь кэш обновился.
-
Вот такой еще вопрос.
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;
-
Возможно ли вернуть результат без создания переменной res?
В текущей реализации нельзя. Можно сделать что-то типа "JS.cast(value, type)". Как там принято в обероновском SYSTEM - SYSTEM.VAL?
-
Возможно ли вернуть результат без создания переменной res?
В текущей реализации нельзя. Можно сделать что-то типа "JS.cast(value, type)". Как там принято в обероновском SYSTEM - SYSTEM.VAL?
А в качестве value нельзя будет подставить "Math.sin(x)" ?
Дополнительные переменные, это ведь получается лишние затраты на оперативную память. Лучше сразу вернуть значение как-то.
-
А в качестве value нельзя будет подставить "Math.sin(x)" ?
Можно и так сделать.
Дополнительные переменные, это ведь получается лишние затраты на оперативную память. Лучше сразу вернуть значение как-то.
Этого нельзя предположить для современного JS движка. Скорее всего в данном случае код с дополнительной переменной будет оптимизирован так же как и без. Эта фича имеет смысл только для того, чтобы биндинги проще писать было.
-
Создал тебе issue на GitHub. А обновлять надо с Ctrl+F5, чтобы весь кэш обновился.
Фикснул. Но возможно еще будут какие-то похожие штуки вылазить - сообщай плз.
А с кэшем надо что-то делать - иначе у других пользователей такая же проблема будет.
-
Можно заголовки у страницы настроить.
<meta http-equiv="Cache-Control" content="no-cache">
Или заголовки у http-ответа указать.
-
Вот такой еще вопрос.
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;
-
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;
-
Можно заголовки у страницы настроить.
<meta http-equiv="Cache-Control" content="no-cache">
Или заголовки у http-ответа указать.
Это плохая идея, так как компилятор пол мегабайта весит :)
-
Это плохая идея, так как компилятор пол мегабайта весит :)
Ты так говоришь, как будто пол гигабайта ;) Я не специалист в Web и не знаю как такие проблемы решаются правильно с текущими технологиями, но одно из существующих/проверенных решений это добавление хэша к имени файла скрипта. Естественное это подразумевает какую-то автоматизацию сборки сайта.
-
Создал тебе 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;
}
Закомментировал пока эти инструкции.
-
С проблемой зависания вроде разобрался, не совсем корректно передаю JS через ajax. Поэтому ++ в цикле пропал.
-
Ох уж эти web технологии. Стоит добавить букву o или число Пи, как программы перестают нормально кодироваться в base64.
Может кто-то знает метод?!
Пока лучшее, что я нашел это вот такая функция.
function b64EncodeUnicode(str) {
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
-
Может кто-то знает метод?!
Ты гуглил? ;) Из общих соображений и для проверки правильного понимания концепций: base64 это кодировка для бинарей, перед тем как ее использовать надо текст перегнать в бинарь, чтобы текст перегнать в бинарь надо определиться в какой кодировке будет этот текст будучи в бинаре (UTF8?).
-
Может кто-то знает метод?!
Ты гуглил? ;) Из общих соображений и для проверки правильного понимания концепций: base64 это кодировка для бинарей, перед тем как ее использовать надо текст перегнать в бинарь, чтобы текст перегнать в бинарь надо определиться в какой кодировке будет этот текст будучи в бинаре (UTF8?).
Да, много часов потратил на эти поиски. UTF8 подойдет, да.
encodeURIComponent как раз вроде перегоняет в бинарь.
http://ecmanaut.blogspot.ru/2006/07/encoding-decoding-utf8-in-javascript.html
-
вот так заработало!
function b64EncodeUnicode(str) {
return btoa(unescape(encodeURIComponent(str)));
}
Сейчас еще проверю на задачке Дагаева.
-
Не работает все равно :(
function Draw(){
D.SetFont("Times New Roman");
D.String("Это высказывание ложно", 50, 100, 40);
D.String("ЭтЈ4,</script>
-
Вот вроде есть рецепт тут, и тоже не работает :(
https://scotch.io/tutorials/how-to-encode-and-decode-strings-with-base64-in-javascript
-
вот так заработало!
Да, это типа рекомендованный способ. Видимо проблема где-то в другом месте.
-
Вот эти две функции работают с русскими буквами и прочими пи в моем хроме:
function encode( s ) {
return btoa( unescape( encodeURIComponent( s ) ) );
}
function decode( s ) {
return decodeURIComponent( escape( atob( s ) ) );
}
encode("варпваπ");
"0LLQsNGA0L/QstCwz4A="
decode("0LLQsNGA0L/QstCwz4A=")
"варпваπ"
-
Мне кажется я перемудрил. Достаточно простого encodeURIComponent для кода и он нормально передается через ajax запрос... а опыт сегодняшнего дня с base64 забуду как страшный сон
-
Влад, а тут Comdiv интересовался, почему проверка индексов так много времени занимает?
Он пример накидал, что разница в 10 раз получается:
https://models.molpit.org/model/59
-
Добавил обработчики мыши, получился слайдер
https://models.molpit.org/model/52
В целом осталось добавить базовые преобразователи, доработать модуль работы со строками и можно говорить про некую альфа-версию :-)
-
Влад, я сделал модуль для базовых операций со строками. Но вот ASSERT когда срабатывает, нельзя ли указывать в какой он процедуре сработал?
-
Влад, а тут Comdiv интересовался, почему проверка индексов так много времени занимает?
Потому что не считать выход за границы ошибкой одно из многих идиотских решений в джаваскрипте :)
Он пример накидал, что разница в 10 раз получается:
https://models.molpit.org/model/59
Да, если есть тест на котором хорошо видно разницу - гляну.
-
Добавил обработчики мыши, получился слайдер
https://models.molpit.org/model/52
Слайдер не работает на мобиле. А вот все остальное работает. Профит! :)
-
Влад, я сделал модуль для базовых операций со строками. Но вот ASSERT когда срабатывает, нельзя ли указывать в какой он процедуре сработал?
Процедуру вытащить можно, но непонятно зачем, если тебе и так весь стек доступен - см. свойство "stack" у перехваченного исключения.
-
Влад, я сделал модуль для базовых операций со строками. Но вот ASSERT когда срабатывает, нельзя ли указывать в какой он процедуре сработал?
Процедуру вытащить можно, но непонятно зачем, если тебе и так весь стек доступен - см. свойство "stack" у перехваченного исключения.
Погляжу, не знал про это свойство.
-
Можно заголовки у страницы настроить.
<meta http-equiv="Cache-Control" content="no-cache">
Или заголовки у http-ответа указать.
Это плохая идея, так как компилятор пол мегабайта весит :)
Во-первых, сервер сжимает передаваемые данные (или его можно настроить, чтобы он сжимал). Так что это после распаковки будет пол мегабайта.
Во-вторых, есть <frame> и <iframe>. Как я понимаю, с их помощью можно разбить страницу на несколько частей, которые будут иметь свои заголовки. Но это надо проверить. У меня был где-то пример. Если найду, то сообщу.
-
Валерий, не парьтесь, проблема решена на стороне сервера. У меня были слишком агрессивные настройки кэширования. Теперь все ок.
-
Ну вот Валера Шипков и Дмитрий Дагаев добавили примеров тоже :)
У меня пока пауза по работе, но мне дали много рекомендаций как улучшить интерфейс для мобилы и для ПК. Так что в середине марта вернусь с новой силой к проекту.
-
Я не знаю подписан ли кто-то из вашей компании на мой новостной канал по Бэкбоксу и Оберону.
Если нет, то подписывайтесь, и предлагайте для него новости, при необходимости что-то осветить :)
https://t.me/BlackBoxOberon
-
Столкнулся с тем, что CHAR транслятор понимает как числа.
PROCEDURE Char*(arg: CHAR);
BEGIN
JS.do("document.getElementById('log').innerHTML = document.getElementById('log').innerHTML + arg")
END Char;
Выводятся числа...
-
Еще хочется понять как выполнять преобразования типов. Мне надо четыре байта переделать в INTEGER.
В вики написано:
No SYSTEM module
А как делать тогда?
-
Столкнулся с тем, что CHAR транслятор понимает как числа.
На это были причины. Для твоего случая надо просто сделать String.fromCharCode(arg)
-
С преобразованием типов вроде разобрался, спасибо, 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;
-
Еще хочется понять как выполнять преобразования типов. Мне надо четыре байта переделать в INTEGER.
В вики написано:
No SYSTEM module
А как делать тогда?
Модуль JS вместо SYSTEM. Но в твоем случае можно обойтись обычным обероном:
result := b1 + LSL(b2, 8) + LSL(b3, 16) + LSL(b4, 24);
-
Столкнулся с тем, что CHAR транслятор понимает как числа.
На это были причины. Для твоего случая надо просто сделать String.fromCharCode(arg)
Firefox почему-то ругается
String.fromCharCode is not a function
-
Модуль 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;
-
Еще прошу поделиться опытом, как быть с динамическими объектами. Скажем, если мне надо создать массив под данные из файла.
NEW нельзя получается, массивы объявить тоже только по константе возможно.
Только статические типы получается? То есть заранее делать огномный буфер под предполагаемый размер?
Или есть какие-то варианты?
-
Firefox почему-то ругается
String.fromCharCode is not a function
Должно быть. Вот мозилловская документация: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode
Приведи весь сгенеренный код или минимальный пример, где оно не работает.
-
Еще прошу поделиться опытом, как быть с динамическими объектами. Скажем, если мне надо создать массив под данные из файла.
NEW нельзя получается, массивы объявить тоже только по константе возможно.
Только статические типы получается? То есть заранее делать огномный буфер под предполагаемый размер?
Или есть какие-то варианты?
1. Eberon (я там сделал поддержку динамических массивов).
2. Системный модуль JS: Вызвать RTL$.makeArray c нужным размером.
Вообще если ты собрался что-то читать из файла, то тебе все равно без JS не обойтись. Там же в биндинге сделай и массив нужного размера.
По подводу "как с этим жить" тебе Info21 расскажет на oberoncore 8) По мне так никакого глубинного смысла в этом нет вообще - Вирт сэкономил в очередной раз на простоте компилятора при том, что динамические массивы ему все равно не нужны были для очередной задачи.
-
Приведи весь сгенеренный код или минимальный пример, где оно не работает.
Вот погляди.
https://models.molpit.org/model/49
-
https://models.molpit.org/model/49
У тебя глобальный String перекрывается твоей собственной функцией String. Обратиться к глобальному можно так: JS.String.fromCharCode
-
https://models.molpit.org/model/49
У тебя глобальный String перекрывается твоей собственной функцией String. Обратиться к глобальному можно так: JS.String.fromCharCode
Спасибо! Поправил. Буду бдителен на этот счет впредь.