Автор Тема: OberonJS  (Прочитано 72355 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: OberonJS
« Ответ #45 : Февраль 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 и вперед :)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: OberonJS
« Ответ #46 : Февраль 15, 2017, 06:15:04 am »
добавление префиксов к именам модулей в переменных JavaScript не помогло :(

Какие префиксы? Зачем?

Ivan Denisov

  • Jr. Member
  • **
  • Сообщений: 67
    • Просмотр профиля
Re: OberonJS
« Ответ #47 : Февраль 15, 2017, 07:22:00 am »
У меня нет клавиши Break не клавиатуре :(
Я сделал префиксы mod и doc, поскольку подумал, что проблема в том, что стандартная библиотека JavaScript называется Math. Именно с этим модулем Math проблема. Если его закомментировать то этот модуль нормально компилируется.

Ivan Denisov

  • Jr. Member
  • **
  • Сообщений: 67
    • Просмотр профиля
Re: OberonJS
« Ответ #48 : Февраль 15, 2017, 07:22:45 am »
А у тебя похоже moduleLog не может найти, поскольку в кэше старый main.js. Обнови страницу, пожалуйста.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: OberonJS
« Ответ #49 : Февраль 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.

Ivan Denisov

  • Jr. Member
  • **
  • Сообщений: 67
    • Просмотр профиля
Re: OberonJS
« Ответ #50 : Февраль 15, 2017, 04:18:21 pm »
Создал тебе issue на GitHub. А обновлять надо с Ctrl+F5, чтобы весь кэш обновился.

Ivan Denisov

  • Jr. Member
  • **
  • Сообщений: 67
    • Просмотр профиля
Re: OberonJS
« Ответ #51 : Февраль 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;

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: OberonJS
« Ответ #52 : Февраль 16, 2017, 03:02:04 pm »
Возможно ли вернуть результат без создания переменной res?

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

Ivan Denisov

  • Jr. Member
  • **
  • Сообщений: 67
    • Просмотр профиля
Re: OberonJS
« Ответ #53 : Февраль 17, 2017, 12:46:34 am »
Возможно ли вернуть результат без создания переменной res?

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

Дополнительные переменные, это ведь получается лишние затраты на оперативную память. Лучше сразу вернуть значение как-то.
« Последнее редактирование: Февраль 17, 2017, 12:48:07 am от Ivan Denisov »

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: OberonJS
« Ответ #54 : Февраль 17, 2017, 06:18:40 am »
А в качестве value нельзя будет подставить "Math.sin(x)" ?

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

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

Этого нельзя предположить для современного JS движка. Скорее всего в данном случае код с дополнительной переменной будет оптимизирован так же как и без. Эта фича имеет смысл только для того, чтобы биндинги проще писать было.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: OberonJS
« Ответ #55 : Февраль 18, 2017, 07:31:21 am »
Создал тебе issue на GitHub. А обновлять надо с Ctrl+F5, чтобы весь кэш обновился.

Фикснул. Но возможно еще будут какие-то похожие штуки вылазить - сообщай плз.
А с кэшем надо что-то делать - иначе у других пользователей такая же проблема будет.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: OberonJS
« Ответ #56 : Февраль 18, 2017, 10:13:31 am »
Можно заголовки у страницы настроить.
<meta http-equiv="Cache-Control" content="no-cache">

Или заголовки у http-ответа указать.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: OberonJS
« Ответ #57 : Февраль 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;
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: OberonJS
« Ответ #58 : Февраль 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;

Ivan Denisov

  • Jr. Member
  • **
  • Сообщений: 67
    • Просмотр профиля
Re: OberonJS
« Ответ #59 : Февраль 20, 2017, 03:10:01 pm »
Можно заголовки у страницы настроить.
<meta http-equiv="Cache-Control" content="no-cache">

Или заголовки у http-ответа указать.
Это плохая идея, так как компилятор пол мегабайта весит :)