Oberon space
General Category => Общий раздел => Тема начата: adva от Октябрь 22, 2013, 10:47:57 am
-
Уже мозг сломал, помогите, пожалуйста, разобраться.
Есть код (первый это класс на javascript, который хочу использовать, второй, пример как использовать). Не могу понять, как замутить это на обероне (для компилятора онлайн с сайта). В итоге хотелось бы просто функции добавлять, чтобы они динамически подтягивались к объекту. Не пойму, когда надо использовать MODULE, когда TYPE, чтобы добиться нужного эффекта.
В итоге хотелось бы получить нужный объект-наследник, с нужными процедурами (обработчиками событий)
-
Подозреваю, что тут надо будет использовать что-то навроде
for (var key in DredHandlerForm) {
if ( !rabbit.hasOwnProperty(key) ) continue; // пропустить "не свои" свойства
alert (key + " = " + DredHandlerForm[key]); // здесь надо бы динамически прикрутить свойство
-
Уже мозг сломал, помогите, пожалуйста, разобраться.
Есть код (первый это класс на javascript, который хочу использовать, второй, пример как использовать). Не могу понять, как замутить это на обероне (для компилятора онлайн с сайта). В итоге хотелось бы просто функции добавлять, чтобы они динамически подтягивались к объекту. Не пойму, когда надо использовать MODULE, когда TYPE, чтобы добиться нужного эффекта.
В итоге хотелось бы получить нужный объект-наследник, с нужными процедурами (обработчиками событий)
Похоже у форума несварение от кириллицы - можно приаттачить файл с названием на латинице?
-
Вот
-
Подозреваю, что тут надо будет использовать что-то навроде
for (var key in DredHandlerForm) {
if ( !rabbit.hasOwnProperty(key) ) continue; // пропустить "не свои" свойства
alert (key + " = " + DredHandlerForm[key]); // здесь надо бы динамически прикрутить свойство
Хотя, пожалуй, в случае с обероном, свойство не должно прикручиваться динамически подобным образом, т.к. теряется типизация. Или можно?
-
А в обероне можно перебрать все поля у записи в коде? (чтобы получить их наименование, а также присвоить по имени). Или наименования процедур в каком в модуле?
-
А в обероне можно перебрать все поля у записи в коде? (чтобы получить их наименование, а также присвоить по имени). Или наименования процедур в каком в модуле?
В Обероне (языке) нет reflection'a.
А зачем оно тут?
-
Похоже у форума несварение от кириллицы - можно приаттачить файл с названием на латинице?
В опере 12.15 всё норм скачивается (win7)
-
Похоже у форума несварение от кириллицы - можно приаттачить файл с названием на латинице?
В опере 12.15 всё норм скачивается (win7)
Ну, значит у браузера моего несварение. В любом случае какой-то мелкий косячок в движке форума.
-
Уже мозг сломал, помогите, пожалуйста, разобраться.
Есть код (первый это класс на javascript, который хочу использовать, второй, пример как использовать). Не могу понять, как замутить это на обероне (для компилятора онлайн с сайта). В итоге хотелось бы просто функции добавлять, чтобы они динамически подтягивались к объекту. Не пойму, когда надо использовать MODULE, когда TYPE, чтобы добиться нужного эффекта.
В итоге хотелось бы получить нужный объект-наследник, с нужными процедурами (обработчиками событий)
Вам нужно учитывать, что в обероне и в яваскрипте сильно разные модели ООП -- в обероне вариант, приближающийся к привычной для c#/java/delphi модели наследования, в яваскрипте же ООП -- это дополнение существующих объектов-прототипов новыми элементами. Так просто 1-в-1 скопировать не получится...
-
Уже мозг сломал, помогите, пожалуйста, разобраться.
Поскольку у тебя тут предполагается наследование от некой базовой реализации, то на обероне это могло бы выглядеть так:
MODULE test;
IMPORT JS;
TYPE
MyTestScriptForm = RECORD(JS.ScriptForm)
disableAutoEvents: BOOLEAN;
КоманднаяПанель1_Кнопка4: PROCEDURE();
...
Сейчас это не работает. И с таким подходом есть проблемы:
1. В жабаскрипте нет наследования и каждый фреймворк эмулирует классическое ООП наследование по-своему. Например, в твоем это "stdlib.Class.extend" - чего оно там делает и как работает зависит от прихоти разработчика конкретного фреймворка. Т.е., я не могу в компиляторе поддержать сразу все возможные реализации наследования.
2. В обероне (не допиленном) нет методов (связанных процедур), поэтому попытки их эмулировать через процедурные поля будут выглядеть крайне громоздко.
Поэтому я могу предложить зайти с обратной стороны:
1. Реализовать нужную функциональность на обероне, скомпилировать модуль в .js.
2. Потребить этот модуль из самописного .js, который отнаследуется от нужного js-класса и будет дергать нужные методы из скомпилированного в .js оберона.
Понятна идея?
-
А нельзя JS класс импортировать как обероновый модуль?
-
А нельзя JS класс импортировать как обероновый модуль?
В жабаскрипте нет классов (еще раз :) Там есть "объекты" с полями, функции, массивы и строки (все это в утиной диамике). Все. Объекты могут быть связаны между собой "наследованием" столь специфичным, что оно не может быть отражено ни в один нормальный ОО язык :) Из этого говна можно пытаться делать (и делают) что-то более классическое (классы), но потребить это невозможно, потому что нет какого-то стандарта на то, как должен выглядеть "класс в жабаскрипте".
Поэтому, как я уже говорил, намного проще потребить из жабаскрипта обероновский модуль, скомпилированный со всеми проверками типов в .js, чем наоборот.
-
Вообще да, надо допилить хотя бы до возможности хранения ссылки на объект из жабаскрипта. Как-то так:
MOULE Test;
IMPORT JS;
VAR jsObject: JS.var;
BEGIN
jsObject := JS.makeObject();
jsObject.method();
END test.
-
Вообще да, надо допилить хотя бы до возможности хранения ссылки на объект из жабаскрипта. Как-то так:
MOULE Test;
...
Это планируется делать? Если да, то каковы примерные сроки?
Или может лучше сразу советом воспользоваться ?
Поэтому я могу предложить зайти с обратной стороны:
1. Реализовать нужную функциональность на обероне, скомпилировать модуль в .js.
2. Потребить этот модуль из самописного .js, который отнаследуется от нужного js-класса и будет дергать нужные методы из скомпилированного в .js оберона.
-
Это планируется делать? Если да, то каковы примерные сроки?
Только что сделал :) Не знаю когда valexey обновит, но на гитхабе уже.
Или может лучше сразу советом воспользоваться ?
И это тоже. Пробуй как удобнее.
-
спасибо, для меня достаточно оперативно :) . Буду дальше смотреть патихоньку
-
А можно попросить опции компилятора сделать (включать русские символы и _ в идентификатор) ? А то приходится самому изменять isLetter (хотя это наверное не совсем корректно, но ранее было такое предложение).
-
Вообще да, надо допилить хотя бы до возможности хранения ссылки на объект из жабаскрипта. Как-то так:
MOULE Test;
IMPORT JS;
VAR jsObject: JS.var;
BEGIN
jsObject := JS.makeObject();
jsObject.method();
END test.
Это и так можно :-) Не вижу смысла в нововведении :-)
Ну, то есть я это уже ведь делал в биндинге к процессингу
-
Это и так можно :-) Не вижу смысла в нововведении :-)
Ну, то есть я это уже ведь делал в биндинге к процессингу
Что-то я не увидел это в биндинге процессора (по крайней мере в примере, который тут выкладывался). Не подскажешь, где посмотреть?
-
А почему сейчас ругается на код:
MODULE DredFormHandler;
IMPORT JS;
VAR
jsO: JS.var;
TYPE
DredForm = POINTER TO RECORD
Form_OnOpen: PROCEDURE
END;
PROCEDURE Form_OnOpen();
BEGIN
JS.alert("Form_OnOpen")
END Form_OnOpen;
BEGIN
END DredFormHandler.
-
Вопрос снят, вар после типе
-
А чем является JS в сгенерированном коде? Почему-то вроде корректный код выдает ошибку при выполнении (JS не задан, как я понял)
-
А нельзя JS класс импортировать как обероновый модуль?
В жабаскрипте нет классов (еще раз :) Там есть "объекты" с полями, функции, массивы и строки (все это в утиной диамике). Все. Объекты могут быть связаны между собой "наследованием" столь специфичным, что оно не может быть отражено ни в один нормальный ОО язык :) Из этого говна можно пытаться делать (и делают) что-то более классическое (классы), но потребить это невозможно, потому что нет какого-то стандарта на то, как должен выглядеть "класс в жабаскрипте".
Поэтому, как я уже говорил, намного проще потребить из жабаскрипта обероновский модуль, скомпилированный со всеми проверками типов в .js, чем наоборот.
Я в курсе, что там как в Lua. Имелся в виду объект, который вроде от модуля ни чем не отличается.
-
По предыдущим вопросам нашел более простое решение, примерно как валексей предложил, оказалось, что можно было указать, из какого объекта javascript брать процедуры для обработчиков формы. Поэтому оказалось достаточно модуля с процедурами.
Теперь такой вопрос:
Как надо указывать тип "строка" в параметрах процедуры? Указал, как PROCEDURE MessageBox(ARRAY 1024 OF CHAR). Вызываю как: MessageBox("тест") компилятор ошибок не выдает. Но почему-то при загрузке скрипта выдается: "недостаточно места в стеке".
В чём может быть дело?
-
Кажется понял в чем дело, вопрос пока снят
-
Да, по предыдущей ошибке догадка верна была. Новый вопрос :)
Какой-то неожиданный результат выдается. Что надо исправить?
MODULE Global;
IMPORT JS;
TYPE
String256* = ARRAY 256 OF CHAR;
PROCEDURE MessageBox*(t: String256); (*{*)
BEGIN
JS.do("JS.alert(t)")
END MessageBox; (*}*)
BEGIN
END Global.
MODULE DredFormHandler;
IMPORT JS, gl:=Global;
BEGIN
gl.MessageBox("Привет");
END DredFormHandler.
-
Я так понял, здесь функция strToArray преобразовывает строку в массив (причем даже не символов похоже, а их кодов, или еще чего), а как из этого массива снова получить строку?
-
Я так понял, здесь функция strToArray преобразовывает строку в массив (причем даже не символов похоже, а их кодов, или еще чего), а как из этого массива снова получить строку?
Символ и его код это одно и то же :-)
Написать обратную функцию на жабаскрипте.
Вообще, я сегодня постараюсь модуль для строк написать. Он мне тоже для ДОМа нужен.
-
Коль у меня после апгрейда OS X сломался XCode, пока он (XCode) ставится, у меня есть время на то, чтобы написать ответ.
Итак:
MOULE Test;
IMPORT JS;
VAR jsObject: JS.var;
BEGIN
jsObject := JS.makeObject();
jsObject.method();
END test.
Как это же сделать без того нововведения в компиляторе (и да, я считаю что дергание js-методов напрямую из Оберон-кода это плохо и потенциально может породить ошибки, поэтому комплятор должен поощрять написание строго статически типизиваронный биндингов и не поощрять дергание js-кода напрямую).
Чтобы не быть голословным, пусть это будет тип String (именно js'ный String, а не какой-то там еще):
MODULE Js;
IMPORT JS;
TYPE
String* = POINTER TO RECORD END;
PROCEDURE MakeStringFromCharArray*(ch : ARRAY OF CHAR) : String;
VAR
res : String;
c : CHAR;
i : INTEGER;
BEGIN
JS.do("res = '';");
i := 0;
WHILE i < LEN(ch) DO
c := ch[i];
JS.do("res += JS.String.fromCharCode(c)");
INC(i);
END;
RETURN res
END MakeStringFromCharArray;
PROCEDURE CharCodeAt*(s : String; n : INTEGER) : INTEGER;
VAR
res : INTEGER;
BEGIN
JS.do("res = s.charCodeAt(n)");
RETURN res
END CharCodeAt;
END Js.
То есть тут на экспорт у нас opaque-тип -- js-строка, к нему у нас самописная процедура для конвертации из оберонистых "строк" -- MakeStringFromCharArray, ну и родной "метод" - CharCodeAt.
А вот тестовый модуль который использует эту прелесть:
MODULE Test;
IMPORT Js, JS;
VAR
str : Js.String;
BEGIN
str := Js.MakeStringFromCharArray("hello world");
JS.alert(str);
JS.alert(Js.CharCodeAt(s,0));
END Test.
Ну а теперь объясните мне - нафига это нововведение в компиляторе было сделано? :-)
-
А можно попросить опции компилятора сделать (включать русские символы и _ в идентификатор) ? А то приходится самому изменять isLetter (хотя это наверное не совсем корректно, но ранее было такое предложение).
git pull и изменяй как хочешь. Потом еще раз git pull за последними изменениями (не скажу конкретные команды, но должно быть тривиально). Пока не хочу отвлекаться на опции (через глобальные переменные делать не буду, а по-нормальному - не совсем тривиально).
-
А можно попросить опции компилятора сделать (включать русские символы и _ в идентификатор) ? А то приходится самому изменять isLetter (хотя это наверное не совсем корректно, но ранее было такое предложение).
git pull и изменяй как хочешь. Потом еще раз git pull за последними изменениями (не скажу конкретные команды, но должно быть тривиально). Пока не хочу отвлекаться на опции (через глобальные переменные делать не буду, а по-нормальному - не совсем тривиально).
Угу. Проект опенсорсный - меняй что хочешь в своем форке :-) Тем более что изменения элементарные (ну и опций компилятора тогда плодить не нужно).
А в мейнстриме это пока не нужно.
-
Ну а теперь объясните мне - нафига это нововведение в компиляторе было сделано? :-)
Представь, что тебе надо проассоциировать жабаскриптовый объект с обероновской записью. Т.е., у тебя общение с миром жабаскрипта не через некий синглетон, о через множество объектов. Тебе ссылки на объекты надо как-то хранить. Можно, конечно, писать что-то типа:
TYPE T = RECORD END;
VAR r: T;
...
JS.do("r.jsObject = JS.makeJsObject()");
Но как-то совсем неявно получается.
-
А чем является JS в сгенерированном коде? Почему-то вроде корректный код выдает ошибку при выполнении (JS не задан, как я понял)
JS - это глобальный объект в терминах жабаскрипта. Неработающий код в студию!
-
Ну а теперь объясните мне - нафига это нововведение в компиляторе было сделано? :-)
Представь, что тебе надо проассоциировать жабаскриптовый объект с обероновской записью. Т.е., у тебя общение с миром жабаскрипта не через некий синглетон, о через множество объектов. Тебе ссылки на объекты надо как-то хранить. Можно, конечно, писать что-то типа:
TYPE T = RECORD END;
VAR r: T;
...
JS.do("r.jsObject = JS.makeJsObject()");
Но как-то совсем неявно получается.
Не понял. Где ты у меня синглетон нашел в коде? :-) Там как раз множество объектов.
Ну, то есть я сейчас вот буду делать привязку к DOM-API, и там, как понимаешь, узлы дерева это множество объектов (да еще разных типов и с множественным наследованием, да!) и каких-то преимуществ от нововведения в компилятор я не вижу для этой работы. Зато отлично представляю как это все написать тем методом которым я воспользовался для String'a.
-
Я в курсе, что там как в Lua. Имелся в виду объект, который вроде от модуля ни чем не отличается.
Поясни свою мысль. "IMPORT JSObjectAsModule" не будет работать просто потому, что компилятор не сможет проверить, что этот JSObjectAsModule экспортирует. Т.е., с тем же успехом можно писать IMPORT JS.
-
Не понял. Где ты у меня синглетон нашел в коде? :-) Там как раз множество объектов.
Ну конечно, ты просто кастнул (жестоко) жабаскриптовый объект к opaque типу :)
Короче, ответ по существу такой: JS.var нужен, чтобы в каких-то местах можно было обойтись без JS.do. Потому что JS.do самое низкоуровневое средство из всех (полный аналог асмовских вставок).
Если ты боишься, что JS.var начнут расползаться по модулям, в которых нет IMPORT JS, то можно запретить экспорт таких полей и экспорт процедур с такими аргументами.
-
Ну а теперь объясните мне - нафига это нововведение в компиляторе было сделано? :-)
Нововведение пока еще не использовал, т.к. нашел другое простое решение (подошло в конкретно моем случае, про другие пока не думаю :) ).
А за подробные разъяснения спасибо. Попробую разобраться в таком подходе. Т.к. чувствую, что это еще понадобится
С ошибками в коде пока вроде разобрался, поэтому код выкладывать не буду. Отдельные ветки компилятора тоже пока делать не буду, нет так нет. Буду локально менять (копипаст одной строки не сильно пока напрягает :) )
-
Кстати, я также не совсем понял, как использовать нововведение JS.var. Из примера не уяснил, создается новая js переменная, или как то можно использовать существующую?
-
Не понял. Где ты у меня синглетон нашел в коде? :-) Там как раз множество объектов.
Ну конечно, ты просто кастнул (жестоко) жабаскриптовый объект к opaque типу :)
Короче, ответ по существу такой: JS.var нужен, чтобы в каких-то местах можно было обойтись без JS.do. Потому что JS.do самое низкоуровневое средство из всех (полный аналог асмовских вставок).
Если ты боишься, что JS.var начнут расползаться по модулям, в которых нет IMPORT JS, то можно запретить экспорт таких полей и экспорт процедур с такими аргументами.
Смотри, мой поинт такой, что человек пишущий биндинг, должен хорошо разбираться в том, что у него на выходе получится. То есть он должен знать и жабаскрипт и оберон. Иначе точно будет лажа. Поэтому возможность работы только через "асмовые вставки" - это хорошо. Это гарантирует что человек хотя бы js знает. И понимает что там нагенерил компилер (может это прочесть и понять).
Вообще, по крайней мере ПОКА я не боюсь что оно что-то куда-то там растекаться начнет, просто из за отсутствия пользовательской базы :-) Бояться должны те, кто этим попытаются воспользоваться, ибо в будущих версиях все это может сильно измениться (соответственно биндинги писанные в таком стиле отвялятся), а вот JS.do - останется :-)
Если хочется что-то сочинить такое для модуля JS, что позволяло бы по большей части обходиться без JS.do, то тут на самом деле сильно думать нужно. Вот такими вот костылями быстро слепленными, эту задачу с наскоку не решить. Но я думать в ту сторону сейчас не могу - мне прыгать надо (биндинги и либы писать), и мне для этих подпрыгиваний замена JS.do не нужна.
Зато после наработки опыта написания биндингов через JS.do возможно станет понятны некие постоянно повторяющиеся паттерны (при написании оных биндингов), которые действительно будет иметь смысл внести в JS (в частности я чувствую что меня местами подзадолбает проверка динамических типов при биндинге к сторонним библиотекам (которые не описаны в каком-либо стандарте) - чтобы гарантировать что внезапно значение левого типа не расползлось по всей программе)..
-
Извиняюсь за "много вопросов", но:
1) многие места хотя вроде и понятны в теории, но не понятны на практике, т.к. программировал до сих пор только на 1С;
2) надеюсь буду полезен в плане тестирования компилятора (т.к. на текущий момент принял решение использовать его в своем проектике)
-
Извиняюсь за "много вопросов", но:
1) многие места хотя вроде и понятны в теории, но не понятны на практике, т.к. программировал до сих пор только на 1С;
2) надеюсь буду полезен в плане тестирования компилятора (т.к. на текущий момент принял решение использовать его в своем проектике)
Реальное использование компилятора безусловно очень важно - чем больше пользователей, тем больше ошибок выявим и быстрее напишем либы. Надеюсь что постепенно у нас появится не только компилятор, но и IDE :-)
-
valexey_u, я правильно понимаю, что основное преимущество в плане "типизации" в том, что твоем случае "фокус" с типизацией осуществляется в модулях биндинга (и если их корректно писать, то проблем в дальнейшем быть не должно), а в случае с JS.var , типизация может нарушаться уже в самих модулях.
-
И еще такой вопрос, зачем в компиляторе строка оберона, преобразовывается в массив кодов символов? Нельзя ее оставить просто строкой?
-
Смотри, мой поинт такой, что человек пишущий биндинг, должен хорошо разбираться в том, что у него на выходе получится. То есть он должен знать и жабаскрипт и оберон. Иначе точно будет лажа. Поэтому возможность работы только через "асмовые вставки" - это хорошо. Это гарантирует что человек хотя бы js знает. И понимает что там нагенерил компилер (может это прочесть и понять).
Таки зависимость от того как именно генерит компилер ниже в случае JS.var. Кроме того, я думаю его использовать как раз для библиотеки строгих кастов:
PROCEDURE toInteger(js: JS.var): INTEGER;
Иначе придется для биндинга реюзать некий кусок жабаскрипта, а не IMPORT JSBinging;
Короче, не надо - не используй. Изъять его у конечного пользователя - это закомментить одну строчку (сам по себе такой специальный тип все равно нужен в реализации).
-
valexey_u, я правильно понимаю, что основное преимущество в плане "типизации" в том, что твоем случае "фокус" с типизацией осуществляется в модулях биндинга (и если их корректно писать, то проблем в дальнейшем быть не должно), а в случае с JS.var , типизация может нарушаться уже в самих модулях.
JS.var предназначен только для удобства написания биндинга. Собственно использовать его без IMPORT JS и не получится.
-
И еще такой вопрос, зачем в компиляторе строка оберона, преобразовывается в массив кодов символов? Нельзя ее оставить просто строкой?
Потому что строки в жабаскрипте иммутабельны. А содержимое обероновского ARRAY OF CHAR может быть изменено.
-
JS - это глобальный объект в терминах жабаскрипта. Неработающий код в студию!
А чем мне проинициировать JS ? (я код не в браузере запускаю, а как плагин снегопата)
-
JS - это глобальный объект в терминах жабаскрипта. Неработающий код в студию!
А чем мне проинициировать JS ? (я код не в браузере запускаю, а как плагин снегопата)
Зачем его инициализировать?
-
Представь, что тебе надо проассоциировать жабаскриптовый объект с обероновской записью. Т.е., у тебя общение с миром жабаскрипта не через некий синглетон, о через множество объектов. Тебе ссылки на объекты надо как-то хранить. Можно, конечно, писать что-то типа:
TYPE T = RECORD END;
VAR r: T;
...
JS.do("r.jsObject = JS.makeJsObject()");
Но как-то совсем неявно получается.
Да, нюанс - так делать нельзя.
То есть для opaque-типа T вот так делать нельзя:
TYPE T = RECORD END;
Нужно так:
TYPE T = POINTER TO RECORD END;
Просто потому, что у нас семантика указателя а не значения. Ну, в частности из процедур POINTER возвращать можно, а вот RECORD нельзя.
-
Зачем его инициализировать?
Может здесь я не правильно выразился.
Хотелось бы использовать твои биндинги без доработок :)
В процедуре по получению строки из массива у тебя указано:
JS.String.fromCharCode
У меня при выполнении ругается, что объект JS.String или не имеет соответствующего метода, или равен null
Если же просто напишу:
String.fromCharCode
То все работает. Вот и возник вопрос, как я могу оставить без изменения JS.String.fromCharCode
-
Зачем его инициализировать?
Может здесь я не правильно выразился.
Хотелось бы использовать твои биндинги без доработок :)
В процедуре по получению строки из массива у тебя указано:
JS.String.fromCharCode
У меня при выполнении ругается, что объект JS.String или не имеет соответствующего метода, или равен null
Если же просто напишу:
String.fromCharCode
То все работает. Вот и возник вопрос, как я могу оставить без изменения JS.String.fromCharCode
Это очень странно.
Смотри, вот простейший скомпиленный код (оберонов модуль):
var test = function (JS){
JS.alert("Hello, World!");
}(this);
Видно что это функция которая принимает в качестве аргуманта (JS) объект this. (ну и понятно что эта функция сразу вызывается после загрузки)
Этот js-код понятен?
В твоем окружении есть repl/js-консоль? Что там будет если набрать this? То есть что там вообще есть?
Скажем в Node.js таких проблем нет, хотя это ни разу не браузер.
-
По консоли ничего пока не знаю, стандартно в конфигураторе 1С ее нет (а я именно в нем запускаю скрипты, используя снегопат). Попробую выяснить на форуме снегопата, почему данный код не работает
-
Так. Выяснил, что в качестве параметра функции вместо this в качестве глобального контекста надо использовать SelfScript.self ? Где мне в компиляторе чего поменять, а то боюсь долго искать буду?
-
хотя пожалуй, пока не критично, пока модулей биндинга не критически много :)
-
И нет, оказывается сработал другой код (без JS, пока ничего менять не буду)
-
Так. Выяснил, что в качестве параметра функции вместо this в качестве глобального контекста надо использовать SelfScript.self ? Где мне в компиляторе чего поменять, а то боюсь долго искать буду?
А это что такое вообще?
-
И нет, оказывается сработал другой код (без JS, пока ничего менять не буду)
Без JS могут быть коллизии имен, когда сущность в Оберон-модуле (например тип) совпадает с именем глобальной сущности жабаскрипта, и в результате к глобальной этой сущности обратиться никак не возможно.
-
И нет, оказывается сработал другой код (без JS, пока ничего менять не буду)
Без JS могут быть коллизии имен, когда сущность в Оберон-модуле (например тип) совпадает с именем глобальной сущности жабаскрипта, и в результате к глобальной этой сущности обратиться никак не возможно.
Точно, есть такая проблема, еще кода не написал, а ошибка такая уже вылезла (по поводу нехватки памяти стека, что ли, не помню уже точную формулировку). Наверное все таки доразобраться надо, а то будут неудобства.
Может это что-то прояснит, а то на том форуме еще дольше ответов ждать:
Объект ISelfScript
Этот объект не являются частью SnegAPI, а предоставляется загрузчиком скриптов отдельно для каждого загруженного скрипта. С его помощью скрипт может получить информацию о себе, получить ссылку на себя, а также добавлять объекты в свое пространство имен. Каждый скрипт имеет доступ к этому объекту через имя SelfScript.
Свойство uniqueName
Только чтение. Строка. Уникальное имя скрипта.
Свойство displayName
Только чтение. Строка. Отображаемое имя скрипта.
Свойство fullPath
Только чтение. Строка. Полный путь к файлу скрипта.
Метод addNamedItem
Добавляет объект в пространство имен скрипта.
Синтаксис:
SelfScript.addNamedItem(Имя, Объект, [Глобально])
Параметры:
Имя. Строка. Название, под которым объект будет доступен в скрипте.
Объект. Ссылка на добавляемый объект.
[Глобально]. Необязательный. Булево. По-умолчанию false. Если передать true, объект добавиться как глобальный, т.е. к его методам и свойствам можно будет обращаться напрямую, без указания имени объекта.
Свойство self
Только чтение. Объект. Сам объект скрипта, т.е. то, как он видится со-стороны. Служит для передачи ссылки
на себя в различные методы.
-
Так. Выяснил, что в качестве параметра функции вместо this в качестве глобального контекста надо использовать SelfScript.self ? Где мне в компиляторе чего поменять, а то боюсь долго искать буду?
А это что такое вообще?
В общем в какой-то консоли (неполноценная я так понимаю, но хоть что-то), не работает, а в самом скрипте работает. Так что вместо this стоит использовать в вызове модуля SelfScript.self
Вопрос: "А это что такое вообще?" не понятен? Где я пишу скрипты? Это скрипты для автоматизации конфигуратора 1С на основе сторонней разработки Снегопат.
-
Быстрый вопрос - какие возможности вывода есть в Снегопате? То есть console.log() есть ? alert() есть? Что-то другое?
Я попробую написать короткий тест окружения (на js) как только будет информация о том как это дело выводить :-)
-
Так. Выяснил, что в качестве параметра функции вместо this в качестве глобального контекста надо использовать SelfScript.self ? Где мне в компиляторе чего поменять, а то боюсь долго искать буду?
Искать "this" в файле module.js - это оно. Поменяй его на "SelfScript.self".
-
Так. Выяснил, что в качестве параметра функции вместо this в качестве глобального контекста надо использовать SelfScript.self ? Где мне в компиляторе чего поменять, а то боюсь долго искать буду?
Вообще "классика" получения глобального объекта в жабаскрипте выглядит вот так:
var global = (function(){return this;})();
Но так как подобный "конструкт" больше похож на херню, чем на что-то осмысленное, то всякие анализаторы будут ругаться. Кроме того, оно вроде не работает в случае "use strict". Поэтому в компиляторе я использовал просто "this". Пока не предложат чего-то лучшего.
-
Но так как подобный "конструкт" больше похож на херню, чем на что-то осмысленное...
Ну это же справедливо и для js'а, как языка, вообще :-)
-
Быстрый вопрос - какие возможности вывода есть в Снегопате? То есть console.log() есть ? alert() есть? Что-то другое?
Я попробую написать короткий тест окружения (на js) как только будет информация о том как это дело выводить :-)
Message (сообщение в текстовое окно)
MessageBox = alert
Кажется и alert тоже работает
-
Быстрый вопрос - какие возможности вывода есть в Снегопате? То есть console.log() есть ? alert() есть? Что-то другое?
Я попробую написать короткий тест окружения (на js) как только будет информация о том как это дело выводить :-)
Message (сообщение в текстовое окно)
MessageBox = alert
Кажется и alert тоже работает
Хотя думаю уже не актуально, тест писать, если только еще для каких целей понадобится.
SelfScript.Self успешно заменяет this
-
Что значит ошибка:
cannot export anonymous RECORD field: 'Name'
в коде
File* = POINTER TO RECORD
Name*, BaseName*: ARRAY 256 OF CHAR;
FullName*, Path*: ARRAY 1024 OF CHAR;
Extension*: ARRAY 10 OF CHAR;
Exist*, IsDirectory*, IsFile*: PROCEDURE
END;
-
И там же вопрос. Если поля IsFile должно булево возвращать, то оформление правильно сделано, или надо как то обозначить возвращение значения? Такой же вопрос, для случая, когда надо передать параметры, они в полях должны быть обозначены?
-
И там же вопрос. Если поля IsFile должно булево возвращать, то оформление правильно сделано, или надо как то обозначить возвращение значения? Такой же вопрос, для случая, когда надо передать параметры, они в полях должны быть обозначены?
Здесь у Вас все три процедуры не принимают параметров и не возвращают результат:
Exist*, IsDirectory*, IsFile*: PROCEDURE
Лучше делать так, наверное:
TYPE
BoolProc* = PROCEDURE () : BOOLEAN;
FileName* = ARRAY 256 OF CHAR;
FilePath* = ARRAY 1024 OF CHAR;
FilePtr* = POINTER TO File;
File* =
RECORD
Name* : FileName;
BaseName* : FileName;
FullName* : FilePath;
Path* : FilePath;
Extension*: ARRAY 10 OF CHAR;
Exist* : BoolProc;
IsDirectory* : BoolProc;
IsFile* : BoolProc
END;
-
Спасибо, так вроде как компилируется.
Правда не понимаю, почему, ведь Extension осталось типа ARRAY
С процедурами понятно, а вот с полями не очень.
-
А, увидел главное отличие, поля сделаны для рекорда, а не для указателя, еще раз спасибо, попробую свой код переделать
-
Что-то не нашел, а в формальных параметрах процедуры можно указать значения по умолчанию? Или как это сделать? И как передавать пустой параметр при вызове, просто не указывать его?
-
Что-то не нашел, а в формальных параметрах процедуры можно указать значения по умолчанию? Или как это сделать? И как передавать пустой параметр при вызове, просто не указывать его?
Нельзя.
-
Что-то не нашел, а в формальных параметрах процедуры можно указать значения по умолчанию? Или как это сделать? И как передавать пустой параметр при вызове, просто не указывать его?
Прочитайте наконец легендарные "16 страниц" (https://github.com/vladfolts/oberonjs/blob/master/doc/Oberon07.Report.pdf) -- вопросов станет заметно меньше, и работа пойдёт куда быстрее )))
-
Не знаю, важно ли, но нижеследующий код неверно идентифицирует ошибку (или мне так кажется, что неверно). Вместо того, чтобы указать, что незакрыта скобка, указывается, что другой тип ожидается.
(*!BEGINCOMMONMODULEOBERON7*)
(* Модуль для работы с кодом Javascript *)
MODULE Js;
IMPORT JS;
TYPE
String* = POINTER TO RECORD END;
PROCEDURE StringFromArrayChar*(arr : ARRAY OF CHAR) : String;
VAR
s : String;
i : INTEGER;
BEGIN
JS.do("s = ''");
JS.do("for(mi=0; i<arr.length; i++) {s = s + JS.String.fromCharCode(arr[i])}");
RETURN s
END StringFromArrayChar;
PROCEDURE ArrayFromString*(s : String; VAR res: ARRAY OF CHAR);
VAR i: INTEGER;
BEGIN
JS.do("res = RTL$.strToArray(s)");
END ArrayFromString;
PROCEDURE CharCodeAt(s : String; n : INTEGER) : INTEGER;
VAR
res : INTEGER;
BEGIN
JS.do("res = s.charCodeAt(n)");
RETURN res
END CharCodeAt;
(* *)
PROCEDURE Replace*(s, pattern, what: String): String;
VAR
res: String;
BEGIN
JS.do("res = s.replace(pattern, what)");
RETURN res
END Replace;
(* *)
PROCEDURE Search*(s, what: String): INTEGER;
VAR
res: INTEGER;
BEGIN
JS.do("res = s.search(what)");
RETURN res
END Search;
(* *)
PROCEDURE Concat*(s1, s2: String): String;
VAR
res: String;
BEGIN
JS.do("res = s1 + s2");
RETURN res
END Concat;
BEGIN
END Js.
(* Модуль для работы с API снегопата *)
MODULE Snegopat;
IMPORT Js, JS;
TYPE
(* Выделение редактора текста *)
Selection* = POINTER TO SelectionRec;
SelectionRec* = RECORD
beginRow, beginCol, endRow, endCol: INTEGER
END;
(* окно редактора текста *)
TextWindow* = POINTER TO TextWindowRec;
TextWindowRec* = RECORD
text*, selectedText*: Js.String;
hwnd*: INTEGER;
multyEdit*: BOOLEAN;
linesCount*: INTEGER
END;
(* *)
PROCEDURE ScriptFullPath*(): Js.String; (*{*)
VAR
res: Js.String;
BEGIN
JS.do("res = JS.SelfScript.fullPath");
RETURN res
END ScriptFullPath; (*}*)
(* *)
PROCEDURE activeTextWindow*(): TextWindow; (*{*)
VAR wnd: TextWindow;
BEGIN
JS.do("wnd = JS.snegopat.activeTextWindow()");
RETURN wnd
END activeTextWindow; (*}*)
(* *)
PROCEDURE GetSelection*(TextWnd: TextWindow): Selection; (*{*)
VAR
res: Selection;
BEGIN
JS.do("res = TextWnd.getSelection()");
RETURN res
END GetSelection; (*}*)
(* *)
PROCEDURE GetCaretPos*(TextWnd: TextWindow): Selection; (*{*)
VAR
res: Selection;
BEGIN
JS.do("res = TextWnd.getCaretPos()");
RETURN res
END GetCaretPos; (*}*)
(* *)
PROCEDURE SetSelection*(TextWnd: TextWindow; StartLine, StartCol, EndLine, EndCol: INTEGER); (*{*)
BEGIN
JS.do("TextWnd.setSelection(StartLine, StartCol, EndLine, EndCol)")
END SetSelection; (*}*)
(* *)
PROCEDURE SetCaretPos*(TextWnd: TextWindow; Line, Col: INTEGER); (*{*)
BEGIN
JS.do("TextWnd.setCaretPos(Line, Col)")
END SetCaretPos; (*}*)
(* *)
PROCEDURE Line*(TextWnd: TextWindow; ind: INTEGER): Js.String; (*{*)
VAR
res: Js.String;
BEGIN
JS.do("res = TextWnd.line(ind)");
RETURN res
END Line; (*}*)
BEGIN
END Snegopat.
(* Модуль для работы с глобальным контектом конфигуратора 1С *)
MODULE GlobalDesigner;
IMPORT Js, JS;
TYPE
(* Файл *)
File* = POINTER TO FileRec;
FileRec* = RECORD
Name*, BaseName*: ARRAY 256 OF CHAR;
FullName*, Path*: ARRAY 1024 OF CHAR;
Extension*: ARRAY 10 OF CHAR;
Exist*, IsDirectory*, IsFile*: PROCEDURE(): BOOLEAN
END;
(* Текстовый документ *)
TextDocument* = POINTER TO TextDocumentRec;
TextDocumentRec* = RECORD
InsertLine*, ReplaceLine*: PROCEDURE (i: INTEGER; s: Js.String);
Put*: PROCEDURE (textdoc: TextDocument);
AddLine*, SetText*, SetFileType*: PROCEDURE (s: Js.String);
Write*, Read*: PROCEDURE (FileName, FileType, LineSeparator: Js.String);
LineCount*: PROCEDURE(): INTEGER;
Clear*: PROCEDURE;
Show*: PROCEDURE(Title, FileName: Js.String);
GetLine*: PROCEDURE (i: INTEGER): Js.String;
GetText*: PROCEDURE (): Js.String;
DeleteLine*: PROCEDURE (i: INTEGER)
END;
(* Предупреждение *)
PROCEDURE MessageBox*(str: ARRAY OF CHAR); (*{*)
BEGIN
JS.do("JS.Designer.MessageBox(Js.StringFromArrayChar(str))")
END MessageBox; (*}*)
(* Сообщить *)
PROCEDURE Message*(str: ARRAY OF CHAR); (*{*)
BEGIN
JS.do("JS.Designer.Message(Js.StringFromArrayChar(str))")
END Message; (*}*)
(* КОНСТРУКТОРЫ ОБЪЕКТОВ *)
(* Файл *)
PROCEDURE NewFile*(Name: Js.String): File; (*{*)
VAR
obj: File;
BEGIN
JS.do("obj = JS.Designer.v8New('File', Name)");
RETURN obj
END NewFile; (*}*)
(* ТекстовыйДокумент *)
PROCEDURE NewTextDocument(): TextDocument; (*{*)
VAR
obj: TextDocument;
BEGIN
JS.do("obj = JS.Designer.v8New('TextDocument')")
RETURN obj
END NewTextDocument; (*}*)
(* *)
PROCEDURE Find*(Str, SubStr: Js.String): INTEGER; (*{*)
VAR
res: INTEGER;
BEGIN
JS.do("res = JS.Designer.Find(Str, SubStr)");
RETURN res
END Find; (*}*)
BEGIN
END GlobalDesigner.
(*!ENDCOMMONMODULEOBERON7*)
(* Модуль для работы с кодом *)
MODULE Tools;
IMPORT Js, JS, gl:=GlobalDesigner, sn:= Snegopat;
CONST
BEGINMODULEOBERON7 = "BEGINMODULEOBERON7";
ENDMODULEOBERON7 = "ENDMODULEOBERON7";
BEGINCOMMONMODULEOBERON7 = "BEGINCOMMONMODULEOBERON7";
ENDCOMMONMODULEOBERON7 = "ENDCOMMONMODULEOBERON7)";
(* Процедура компилирует текст активного тектового окна *)
PROCEDURE CompileActiveTextWindow*(); (*{*)
VAR
BEGIN
gl.MessageBox("тодо Пока не реализовано");
END CompileActiveTextWindow; (*}*)
(* *)
PROCEDURE ExistCodeOberon(TextWnd: sn.TextWindow; VAR beginRow, endRow: INTEGER; CommModule: BOOLEAN): BOOLEAN; (*{*)
VAR
res: BOOLEAN;
ind, countRow, pos: INTEGER;
str: Js.String;
arr: ARRAY 1024 OF CHAR;
BEGIN
beginRow := 0;
endRow := 0;
countRow := TextWnd.linesCount;
ind := 0;
WHILE ind < countRow DO
INC(ind);
str := sn.Line(TextWnd, ind);
IF CommModule THEN
IF Js.Search(str, Js.StringFromArrayChar(BEGINCOMMONMODULEOBERON7)) # -1 THEN
beginRow := ind + 1;
ELSIF Js.Search(str, Js.StringFromArrayChar(ENDCOMMONMODULEOBERON7)) # -1 THEN
endRow := ind + 1;
END;
ELSE
(*IF Js.Search(str, Js.Concat(Js.StringFromArrayChar("!"),Js.StringFromArrayChar(BEGINMODULEOBERON7)) # -1 THEN*)
IF Js.Search(str, Js.Concat(Js.StringFromArrayChar("!"),Js.StringFromArrayChar(BEGINMODULEOBERON7)) # -1 THEN
beginRow := ind + 1;
ELSIF Js.Search(str, Js.Concat(Js.StringFromArrayChar("!"),Js.StringFromArrayChar(ENDMODULEOBERON7)) # -1 THEN
endRow := ind + 1;
END;
END;
END;
IF beginRow > 0 THEN
res := TRUE
ELSE
res := FALSE
END;
RETURN res
END ExistCodeOberon; (*}*)
(* *)
PROCEDURE AddCodeOberon(TextWnd: sn.TextWindow; beginRow, endRow: INTEGER; CommModule: BOOLEAN); (*{*)
VAR
res: BOOLEAN;
BEGIN
(* тодо *)
END AddCodeOberon; (*}*)
(* *)
PROCEDURE EditActiveTextWindow*(); (*{*)
VAR
ActiveTextWnd: sn.TextWindow;
FileCommonModuleO7: gl.File;
name: Js.String;
beginRow, endRow: INTEGER;
BEGIN
ActiveTextWnd := sn.activeTextWindow();
IF ActiveTextWnd = NIL THEN
gl.MessageBox("Не выбрано окно модуля")
ELSE
IF ~ExistCodeOberon(ActiveTextWnd, beginRow, endRow, FALSE) THEN
(* добавить код оберона в конец *)
AddCodeOberon(ActiveTextWnd, beginRow, endRow, FALSE);
ELSE
(* отменить комментирование кода оберона, удалить яваскрипт после оберона *)
END;
name := Js.Replace(sn.ScriptFullPath(), Js.StringFromArrayChar("OberonTools.js"), Js.StringFromArrayChar("CommonModules.ob7"));
FileCommonModuleO7:= gl.NewFile(name);
IF FileCommonModuleO7.Exist() THEN
IF ~ExistCodeOberon(ActiveTextWnd, beginRow, endRow, TRUE) THEN
(* тодо добавить код общих модулей *)
END;
END
END;
END EditActiveTextWindow; (*}*)
BEGIN
END Tools.
-
Не знаю, важно ли, но нижеследующий код неверно идентифицирует ошибку (или мне так кажется, что неверно). Вместо того, чтобы указать, что незакрыта скобка, указывается, что другой тип ожидается.
Там до скобок дело не доходит. Он парсит второй аргумент Js.Search, который из-за пропущенной скобки выглядит как:
Js.Concat(...) # -1
И тут уж ему не нравятся разные типы.
-
И тут уж ему не нравятся разные типы.
Да, я так и подумал, мне это конечно не очень критично, но если планируется и в учебных целях использовать, то про скобки было бы правильнее (на мой взгляд)
-
Да, я так и подумал, мне это конечно не очень критично, но если планируется и в учебных целях использовать, то про скобки было бы правильнее (на мой взгляд)
Проблема автоматически решится при переходе к многопроходности, когда семантика (соответствие типов) будет проверяться после синтаксиса (пропущенные скобки).
-
Я извиняюсь, а какую процедуру из oc.js сейчас требуется запускать для компиляции из текста? И какие там параметры (надо в код на обероне привязать)?
-
Хотя посмотрю в html файле
-
Подскажите, пожалуйста, как из объекта errors (ошибки компиляции) получить текст?
-
Да, я так и подумал, мне это конечно не очень критично, но если планируется и в учебных целях использовать, то про скобки было бы правильнее (на мой взгляд)
Проблема автоматически решится при переходе к многопроходности, когда семантика (соответствие типов) будет проверяться после синтаксиса (пропущенные скобки).
Причем во второй проход получится упихать не всю семантику, часть семантики таки нужна для парсера :-)
-
Подскажите, пожалуйста, как из объекта errors (ошибки компиляции) получить текст?
Не помню такого объекта, там ошибки строками ходили. В каком месте?
-
Причем во второй проход получится упихать не всю семантику, часть семантики таки нужна для парсера :-)
Да, там есть пару мест где семантика непосредственно влияет на парсер.
-
Что-то я не могу разобраться с компиляцией из кода.
Почему-то метод сделал как на сайте приведено:
var text = require('oc.js').compile(src, err);
Но ругается, что нет такого метода (compile есть, а где-то в нем уже ошибка). Отладчика к сожалению нет, посмотреть где именно ошибка не могу. Может я не ту функцию использую?
-
посмотрел, в функциях активно используется this (с которым у меня ранее были проблемы). Может быть проблема такого же рода?
Вроде был упомнинание, что можно компилировать файлы из командной строки. Это как? Последовательность действий не подскажите?
-
Конкретное место ошибки:
В var ModuleResolver в методе compile
ругается на параметр this.__resolveModule.bind(this)
Почему
хотя this.__resolveModule это функция, но вызывается без скобок? В этом случае она же вроде текст функции возвращает? Или так и надо?
Не знаю, по этой ли причине, но свойства bind у this.__resolveModule не имеется. Аналогично думаю и с другим параметром функции compile
-
Вместо отладчика использую функции вывода. Поэтому очень медленно разбор происходит. Не посоветуете, какой-нибудь простенький отладчик скриптов?
-
Чувствую, что bind зачем то нужен, но у меня он не работает. Используется всего в двух местах. Его нельзя заменить чем-нибудь?
-
Вот совет, как эмулировать bind
(правда не знаю, будет ли работать)
http://learn.javascript.ru/bind#кросс-браузерная-эмуляция-bind
-
Вместо отладчика использую функции вывода. Поэтому очень медленно разбор происходит. Не посоветуете, какой-нибудь простенький отладчик скриптов?
Попробуйте гуглохромный отладчик:
https://developers.google.com/chrome-developer-tools/docs/javascript-debugging
-
Да хоть IE'шный (в современном IE он вполне пристойный). Или Firebug в Firefox. Отладчик сейчас есть в любом приличном браузере.
-
Конкретное место ошибки:
В var ModuleResolver в методе compile
ругается на параметр this.__resolveModule.bind(this)
Почему
хотя this.__resolveModule это функция, но вызывается без скобок? В этом случае она же вроде текст функции возвращает? Или так и надо?
Не знаю, по этой ли причине, но свойства bind у this.__resolveModule не имеется. Аналогично думаю и с другим параметром функции compile
В js функция - это объект. С полями, методами и прочим. так что тут просто у функции __resolveModule вызывают "метод" (а на самом деле поле содержащее функцию) bind.
А текст функции, вроде как, в общем случае получить как раз нельзя. На этапе исполнения. Но могу ошибаться конечно.
-
А хром можно использовать для яваскриптов не на web странице? (скорее всего в качестве скриптов плагинов используются ActiveScript )
У меня как раз возвращает текст функции, если без скобок, а если со скобками, то объект (если она при этом корректна)
Но бинд я так понял, в моем случае не поддерживается, хотелось бы его заменить, но не врубился как
-
А хром можно использовать для яваскриптов не на web странице? (скорее всего в качестве скриптов плагинов используются ActiveScript )
Можно использовать nodejs:
http://nodejs.org/api/debugger.html
https://github.com/node-inspector/node-inspector
-
У меня как раз возвращает текст функции, если без скобок, а если со скобками, то объект (если она при этом корректна)
Это НЕ текст, это результат "рефлекшина" - отладочная хрень, результат pretty print'a. Если б это был "текст", то есть строка, то можно было бы так: var foo = function(){return 1;}; alert(foo.length);
Должно вернуть не 0 - ведь длина текста (число символов) явно не нуль :-)
-
Должно вернуть не 0 - ведь длина текста (число символов) явно не нуль :-)
А ты попробуй
alert(("" + foo).length);
P.S. Я не знаю что там говорит стандарт, но в каких-то случаях я видел даже сохраненные комментарии при "распечатке" функции.
-
Чувствую, что bind зачем то нужен, но у меня он не работает. Используется всего в двух местах. Его нельзя заменить чем-нибудь?
bind нет в IE8 (я специально отказался от его использования в точй части компиялятора, который на страничке). Эмулируется примерно так (для твоего случая):
var result = f.bind(this);
аналолг:
var self = this; var result = function(){return f.call(self);}
-
Должно вернуть не 0 - ведь длина текста (число символов) явно не нуль :-)
А ты попробуй
alert(("" + foo).length);
P.S. Я не знаю что там говорит стандарт, но в каких-то случаях я видел даже сохраненные комментарии при "распечатке" функции.
Извращенец! :-) Можно же так: foo.toString() , все!
Но факт что просто foo это не строка и не текст - это объект!
-
посмотрел, в функциях активно используется this (с которым у меня ранее были проблемы). Может быть проблема такого же рода?
Трудно угадать :)
Вроде был упомнинание, что можно компилировать файлы из командной строки. Это как? Последовательность действий не подскажите?
Для командной строки оно работает только для nodejs.
-
посмотрел, в функциях активно используется this (с которым у меня ранее были проблемы). Может быть проблема такого же рода?
Трудно угадать :)
Вроде был упомнинание, что можно компилировать файлы из командной строки. Это как? Последовательность действий не подскажите?
Для командной строки оно работает только для nodejs.
не пугай так! ведь можно же собрать в один этот самый oc.js и уже этот монолит гонять хоть из командной строки хоть в node.js хоть в консоль браузера пихать, хоть еще куда.
Ну, тем более что, насколько я понимаю, adva не нужен компилятор прямо в Снегопат'е, ему нужно обустроить свое рабоче-разработческое место, возможно без браузера. То есть пускать компилер через node.js вполне кошерный вариант (если туда еще отладчик жабашкрипта прикрутить)
-
не пугай так! ведь можно же собрать в один этот самый oc.js и уже этот монолит гонять хоть из командной строки хоть в node.js хоть в консоль браузера пихать, хоть еще куда.
В смысле да. Из коробки только для nodejs. Для чего-то другого надо смотреть как сделаон для nodejs.
-
не пугай так! ведь можно же собрать в один этот самый oc.js и уже этот монолит гонять хоть из командной строки хоть в node.js хоть в консоль браузера пихать, хоть еще куда.
В смысле да. Из коробки только для nodejs. Для чего-то другого надо смотреть как сделаон для nodejs.
Дык можно же oc.js использвать as is для всего подряд. По сути фича ноды лишь в "динамической подгрузке модулей", то есть динамический компоновщик типа. А oc.js уже статически скомпонован и ничего ему больше от этой жизни не нужно.
-
Ну, тем более что, насколько я понимаю, adva не нужен компилятор прямо в Снегопат'е, ему нужно обустроить свое рабоче-разработческое место, возможно без браузера. То есть пускать компилер через node.js вполне кошерный вариант (если туда еще отладчик жабашкрипта прикрутить)
Да да, именно это мне и надо, подскажите, пожалуйста, как это сделать? И компилить, и отладчик бы тоже не помещал. Сам боюсь очень долго буду разбираться, но если нет наработок по этому поводу, то разберусь. Просто уже хотелось бы нужными задачками заняться, а не обустройстом рабочего места :)
-
К тому же английский, далеко не родной мне язык, хотя с другой стороны тоже бы надо скилы прокачивать начинать :), хотя бы на чтение без словаря
-
Вроде есть статьи для начинающих, попробую разобраться
-
Кстати, по поводу файла oc.js . Если я в нем переименую переменную GLOBAL это ни на что не повлияет? А то у меня в снегопате уже забито это имя?
-
Чувствую, что bind зачем то нужен, но у меня он не работает. Используется всего в двух местах. Его нельзя заменить чем-нибудь?
bind нет в IE8 (я специально отказался от его использования в точй части компиялятора, который на страничке). Эмулируется примерно так (для твоего случая):
var result = f.bind(this);
аналолг:
var self = this; var result = function(){return f.call(self);}
А аналог для случая, если функция имеет параметры, не приведешь, а то тоже не прокатывает?
-
Что-то не могу найти, node.js обязательно должен быть установлен для его использования. Или как его использовать можно, в основном все найденные статьи для веб-разработки, может где ссылки попадались на использование не для веб (хотя пожалуй написание веб-сервера это оно и есть)?
-
Что-то не могу найти, node.js обязательно должен быть установлен для его использования. Или как его использовать можно, в основном все найденные статьи для веб-разработки, может где ссылки попадались на использование не для веб (хотя пожалуй написание веб-сервера это оно и есть)?
node.js это просто exeшник, скачивай его и радуйся. установка не нужна :-)
-
Можно пример, как скомпилировать с помощью nodejs , а то боюсь сам долго разбираться буду, а мне пока с его помощью только обустроиться надо, а изучать уже потом бы хотел (чувствую что пригодиться, но позже)
-
Можно пример, как скомпилировать с помощью nodejs , а то боюсь сам долго разбираться буду, а мне пока с его помощью только обустроиться надо, а изучать уже потом бы хотел (чувствую что пригодиться, но позже)
Думаю сегодня разберемся :-)
Ну, то есть у меня оно уже собирает, но есть проблема - пришлось насоздавать каталогов node_modules, иначе нода не может найти подключаемые модули.
vlad: как с этим бороться? Есть какой-то хитрый ключик? Шаманить переменную окружения NODE_PATH?
-
vlad: как с этим бороться? Есть какой-то хитрый ключик? Шаманить переменную окружения NODE_PATH?
Посмотри мои батники. Там вроде с NODE_PATH чего-то делается.
-
vlad: как с этим бороться? Есть какой-то хитрый ключик? Шаманить переменную окружения NODE_PATH?
Посмотри мои батники. Там вроде с NODE_PATH чего-то делается.
Ага, вижу:
@SET NODE_PATH=.;%~dp0../src
@"C:\Program Files\nodejs\node.exe" %~dp0\compile.js %*
Для общего случая не годится (если много вложенных каталогов) :-) Но принцип понять позволяет.
-
А аналог для случая, если функция имеет параметры, не приведешь, а то тоже не прокатывает?
Я там сделал эмуляцию, делай git pull, должно работать.
-
Можно пример, как скомпилировать с помощью nodejs , а то боюсь сам долго разбираться буду, а мне пока с его помощью только обустроиться надо, а изучать уже потом бы хотел (чувствую что пригодиться, но позже)
Тебе надо запустить (помощью nodejs) файл "oc_nodejs.js" - оно напишет чего оно дальше хочет.
-
Что-то не могу найти, node.js обязательно должен быть установлен для его использования. Или как его использовать можно, в основном все найденные статьи для веб-разработки, может где ссылки попадались на использование не для веб (хотя пожалуй написание веб-сервера это оно и есть)?
Хотя я не очень представляю как ьы будешь дружить nodejs и свою среду (снегопат). Так что тебе, наверное, надо все-так заходить со стороны "слинкованного" (как для брауезра) os.js и дергания из него нужных функций.
-
Кстати, по поводу файла oc.js . Если я в нем переименую переменную GLOBAL это ни на что не повлияет? А то у меня в снегопате уже забито это имя?
GLOBAL нужен, чтобы работали слинованные nodejs модули. Ты, конечно, можешь его убрать, но по факту он должен остаться глобабальным объектом или не будет работать.
-
Да да, именно это мне и надо, подскажите, пожалуйста, как это сделать? И компилить, и отладчик бы тоже не помещал. Сам боюсь очень долго буду разбираться, но если нет наработок по этому поводу, то разберусь. Просто уже хотелось бы нужными задачками заняться, а не обустройстом рабочего места :)
Отладчик должен быть там где ты все это будешь запускать. В браузере - браузерный отладчик, в снегопате - хз что там. Лично я при написании всего это дела отладчик не использовал ;) Ну только когда надо было уже в браузере заставить все это рабоать.
-
Да да, именно это мне и надо, подскажите, пожалуйста, как это сделать? И компилить, и отладчик бы тоже не помещал. Сам боюсь очень долго буду разбираться, но если нет наработок по этому поводу, то разберусь. Просто уже хотелось бы нужными задачками заняться, а не обустройстом рабочего места :)
Отладчик должен быть там где ты все это будешь запускать. В браузере - браузерный отладчик, в снегопате - хз что там. Лично я при написании всего это дела отладчик не использовал ;) Ну только когда надо было уже в браузере заставить все это рабоать.
Вообще да, среда для исполнения js-кода (тем более такая необычная среда) без отладчика и консоли - это нонсенс. Если в Снегопате этого нет, то это какой-то позор и вообще это сильно снижает юзабельность продукта.
-
А аналог для случая, если функция имеет параметры, не приведешь, а то тоже не прокатывает?
Я там сделал эмуляцию, делай git pull, должно работать.
Спасибо, но не заработало (хотя на бинд не ругается, но почему-то compile все равно с ошибкой завершается. Буду ставить отладчик, разбираться с ним.
По поводу подружить снегопат и node.js . Сам node.js мне пока это не особо требуется. Если node.js позволяет передавать параметры через командную строку (консоль, или как там она в виндовс называется), то я бы запускал какой-нить скрипт в node.Js, и компилировал файл (который был бы указан в параметрах. Но я так и не понял, что можно делать с node.js в командной строке.
-
По поводу отладчика, сказали что можно использовать visual studio. Или Microsoft script editor из оффиса 2003 (в более поздних его нет). Ну или на крайняк microsoft script debugger ( но я чё то с ходу не разобрался, как в нем переменные просматривать, да и говорят он очень не удобный для отладки).
А так да, я отладчиком обычно пользуюсь больше для изучения чужого кода, чем для написания своего. Это как раз такой случай :)
-
По поводу подружить снегопат и node.js . Сам node.js мне пока это не особо требуется. Если node.js позволяет передавать параметры через командную строку (консоль, или как там она в виндовс называется), то я бы запускал какой-нить скрипт в node.Js, и компилировал файл (который был бы указан в параметрах.
Да, именно так сейчас компилируются исходники компилятора на обероне - nodejs + скрипт (компилятор) + исходник на обероне.
-
Да, именно так сейчас компилируются исходники компилятора на обероне - nodejs + скрипт (компилятор) + исходник на обероне.
Я правильно понял, что строка запуска выглядит так:
>>>node oc.js ИмяФайлаМодуляОберона
-
Я правильно понял, что строка запуска выглядит так:
>>>node oc.js ИмяФайлаМодуляОберона
Посмотри compile_oberon_source.cmd - оно компилит обероновские исходники компилятора.
-
Ну, я собирал так (после того как все пути поборол):
node.exe oc_nodejs.js outputDir Test.ob
-
Ну, я собирал так (после того как все пути поборол):
node.exe oc_nodejs.js outputDir Test.ob
А я чё то не осилил пути (если мы об одних и тех же).
В общем пытался разобратья, у меня compile_oberon_source.cmd выдает что нет такого пути. Попробую и твой вариант.
Парни, спасибо, что до сих пор возитесь со мной :)
-
У меня в данном случае ругается, что не найден модуль node.js хотя указываю oc_node.js
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.
F:\oberonjs-master\src>node oc_nodejs.js Out test.ob
module.js:340
throw err;
^
Error: Cannot find module 'nodejs.js'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (F:\_adva\GoogleDisk\_snegopat\_OberonScript\oberonjs-
master\src\oc_nodejs.js:3:14)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
F:\oberonjs-master\src>node oc_nodejs.j
s Out test.ob
-
У меня в данном случае ругается, что не найден модуль node.js хотя указываю oc_node.js
У тебя должен быть прописан каталог с исходными модулями компилятора (<path to project root>/src) в переменной окружения NODE_PATH. Или ты должен запускать все из этого каталога.
-
F:\oberonjs-master\src>node oc_nodejs.js Out test.ob
Похоже просто запуск из правильного каталога не помогает, пробуй NODE_PATH.
-
Поменял NODE_PATH не помогло
По этому пути какие файлы должны находиться?
Или может перезагрузка требуется (устанавливал через Переменные среды... в windows)
-
О заменил в NODE_PATH слеши на обратные, node.js нашелся, но теперь говорит, что нету RTL$.js
-
Указал NODE_PATH, скопировал туды все файлы (без подпапок), и усё получилось, спасибо огромное
-
Я таким образом могу модули независимо компилировать, или как в браузере надо, если есть импорт, то должен быть и модуль?
-
И еще, у cmd файла есть какое нибудь возвращаемое значение? Или как мне можно получить, код ошибки/успеха?
-
Я таким образом могу модули независимо компилировать, или как в браузере надо, если есть импорт, то должен быть и модуль?
Обероны не поддерживают же независимую компиляцию, это же не си...
А при раздельной компиляции либо нужны definition modules как в модуле-2, либо sym-файлы, которых в этом компиляторе нет, либо исходные коды самих импортированных модулей...
-
И еще, у cmd файла есть какое нибудь возвращаемое значение? Или как мне можно получить, код ошибки/успеха?
Записывать число в переменную %ERRORLEVEL% и потом её анализировать (в других cmd-файлах)
-
Может можно из яваскрипта задать/записать переменную окружения? Это было бы проще
-
Хотя пожалуй даже вывод в файл подойдет. Вроде в node есть работа с файловой системой, попробую реализовать
-
Изменил файл oc_nodejs.js на так:
"use strict";
var nodejs = require("nodejs.js");
var fs = require("fs");
function main(){
if (process.argv.length <= 3){
console.info("Usage: <oc_nodejs> <output dir> <input oberon module file(s)>");
return -1;
}
var outDir = process.argv[2];
var sources = process.argv.slice(3);
var errors = "";
nodejs.compile(sources, function(e){errors += e;}, outDir);
if (errors.length){
fs.writeFile('error.txt', errors, function (err) {
if (err) throw err;
console.log('It\'s saved!');
});
console.error(errors);
return -2;
}
console.info("OK!");
return 0;
}
process.exit(main());
Файл ошибок при этом формируется, но пустой (хотя сообщение об ошибке выдается в консоль), на какое значение надо заменить errors в fs.writeFile ?
-
Даже если строку туда задаю, все равно файл пустой
-
В общем пока могу пожалуй ошибку смотреть в консоли без обработки (без перехода на строку ошибки), но если вдруг подскажите, как в файл выводить, то буду признателен. Но это уже не срочный вопрос.
Спасибо еще раз.
Пока перейду к более актуальным задачам
-
Все таки еще раз прощу уточнить про "раздельную" (на самом деле имел в виду другое) компиляцию, я могу компилировать через node модуль, если у меня оберонмодуля будут лежать в отдельных файлах? Или надо сначала получить общий файл?
-
И еще такой вопрос, можно ли возвращать не -2 а -№ строки ошибки?
-
Про раздельную компиляцию выявил, компилируется, при наличии соответствующего файла (с названием модуля). Вопрос снят.
-
Вопрос: если сделаю отдельную ветку по компилятору (или как там это называется, имею в виду исходники на гитхабе). То при изменении основной ветки если конфликтов не будет, ветка будет автоматически обновляться?
-
Вопрос: если сделаю отдельную ветку по компилятору (или как там это называется, имею в виду исходники на гитхабе). То при изменении основной ветки если конфликтов не будет, ветка будет автоматически обновляться?
Нет, надо руками обновлять (но это в общем то не так уж с тяжело)
-
О заменил в NODE_PATH слеши на обратные, node.js нашелся, но теперь говорит, что нету RTL$.js
Надо еще путь к подкаталогу oberon.js прописать.
-
О заменил в NODE_PATH слеши на обратные, node.js нашелся, но теперь говорит, что нету RTL$.js
Надо еще путь к подкаталогу oberon.js прописать.
Да, так тоже работает, спасибо, так не придется структуру каталогов менять после обновления компилятора. Просто не сразу разобрался, как сразу 2 каталога в переменной среды прописать, были ссылки на линукс, а там разделителем двоеточие являлось, что в винде не работало.
-
Я таким образом могу модули независимо компилировать, или как в браузере надо, если есть импорт, то должен быть и модуль?
Нет, не можешь. Если бы были символьые файлы - тогда можно былор бы раздельно компилировать. Сейчас процесс выглядит так:
- на входе список файлов .ob, которые входят в твою программу
- в процессе компиляции если компилятор натыкается на IMPORT еще не скомпилированного файла .ob - он его компилит (процесс повторяется рекурсивно)
- все файлы можно не указывать, если они импортятся модулями из оригинального списка
- когда все скомпилировано генерится RTL$.js с нужной подеержкой времени исполнения для всех скомпилированных файлов
Я не считаю этот механизм правильным (можно не критиковать), просто на данном этапе это то, что мне нужно для переписывания кусков компилятора на оберон.
-
И еще, у cmd файла есть какое нибудь возвращаемое значение? Или как мне можно получить, код ошибки/успеха?
Лично я, когда у меня возникают подобные вопросы, переписываю батник на питон ;)
P.S. Считайте это рекламой питона.
-
Я таким образом могу модули независимо компилировать, или как в браузере надо, если есть импорт, то должен быть и модуль?
Нет, не можешь. Если бы были символьые файлы - тогда можно былор бы раздельно компилировать. Сейчас процесс выглядит так:
- на входе список файлов .ob, которые входят в твою программу
- в процессе компиляции если компилятор натыкается на IMPORT еще не скомпилированного файла .ob - он его компилит (процесс повторяется рекурсивно)
- все файлы можно не указывать, если они импортятся модулями из оригинального списка
- когда все скомпилировано генерится RTL$.js с нужной подеержкой времени исполнения для всех скомпилированных файлов
Я не считаю этот механизм правильным (можно не критиковать), просто на данном этапе это то, что мне нужно для переписывания кусков компилятора на оберон.
Ну, то есть в переводе на русский, если есть некий модуль Main который импортит еще модули A,B,C,D, которые в свою очередь импортят модуль Foo, то компилятору достаточно дать аргументом Main.ob, а остальное он по цепочке сам найдет (если они есть) и скомпилирует?
-
Файл ошибок при этом формируется, но пустой (хотя сообщение об ошибке выдается в консоль), на какое значение надо заменить errors в fs.writeFile ?
По идее должно работать. Посмотри у меня там используется fs.writeFileSync - оно точно работает.
-
То при изменении основной ветки если конфликтов не будет, ветка будет автоматически обновляться?
Автоматически - да, в том смысле, что тебе не придется самому мерджить.
Вручнок = тоже да, в том смысле, что тебе надо будет делать git pull или гуйню какую-нибудь запускать
-
Ну, то есть в переводе на русский, если есть некий модуль Main который импортит еще модули A,B,C,D, которые в свою очередь импортят модуль Foo, то компилятору достаточно дать аргументом Main.ob, а остальное он по цепочке сам найдет (если они есть) и скомпилирует?
Да.
-
Ну, то есть в переводе на русский, если есть некий модуль Main который импортит еще модули A,B,C,D, которые в свою очередь импортят модуль Foo, то компилятору достаточно дать аргументом Main.ob, а остальное он по цепочке сам найдет (если они есть) и скомпилирует?
Как минимум, один импортируемый файл скомпилился, далее пока не проверял.
Но есть пожелание, можно ли, искать модули оберона для этого в заданных каталогах, да пусть хоть тот же NODE_PATH ? А то придется все файлы в одном месте держать, что не очень. И при этом либо чтобы соблюдалась структура каталогов, в выходном каталоге, либо можно компилить прям туда же, где лежат модули оберона (расширение то все равно другое)
-
И вот так плавно и не заметно мы переходим к обсуждению билд-системы для Оберона :-) А оттуда не далеко и до менеджера пакетов!
Дайошь все на autotools'ах!!1
-
Но есть пожелание, можно ли, искать модули оберона для этого в заданных каталогах
Все можно :) Просто не все сразу
-
И вот так плавно и не заметно мы переходим к обсуждению билд-системы для Оберона :-) А оттуда не далеко и до менеджера пакетов!
Дайошь все на autotools'ах!!1
ТруЪ обероновский инструментарий должен делать только на труЪ оберонах :) А не на старинны юниксовых костылях.
-
Ладно, ладно, я умерю свой зуд :)
-
И вот так плавно и не заметно мы переходим к обсуждению билд-системы для Оберона :-) А оттуда не далеко и до менеджера пакетов!
Дайошь все на autotools'ах!!1
ТруЪ обероновский инструментарий должен делать только на труЪ оберонах :) А не на старинны юниксовых костылях.
Ну, вообще, наверно имеет смысл посмотреть как это сделано у свежих языков - у Go, Haskell и Modula-3. У них у всех все весьма прилично с точки зрения сборки.
-
Выявил ошибку (?): если вдруг окажется, что в NODE_PATH указан и oberon.js и выходной каталог, то ругается на метод RTL$.assert . Похоже потому, что два RTL$.js файла образуются
-
И еще кажется юникодную кодировку файла не воспринимает. Только ANSI ?
-
Подскажите, пожалуйста, куда в node.js надо добавить строку, чтобы она в скомпилированно файле попала в первую строку?
Если в prolog добавляю, то в случае наличия require(RTL ...), она оказывается ниже него
-
И еще у меня при выполнении ругается на отсутсвие exports . Это что-то глобальное для node?
-
Выявил ошибку (?): если вдруг окажется, что в NODE_PATH указан и oberon.js и выходной каталог, то ругается на метод RTL$.assert . Похоже потому, что два RTL$.js файла образуются
Не понял - откуда там два RTL$.js?
-
Выявил ошибку (?): если вдруг окажется, что в NODE_PATH указан и oberon.js и выходной каталог, то ругается на метод RTL$.assert . Похоже потому, что два RTL$.js файла образуются
Не понял - откуда там два RTL$.js?
А. Понял. У меня просто 2 отдельных батника для запуска компиляции и для запуска скомпилированного. С разными NODE_PATH. Поэтому коллизий не происходит.
Я это фиксну со временем - будет один RTL$.js (не будет генерироваться отдельно каждый раз) .
-
И еще кажется юникодную кодировку файла не воспринимает. Только ANSI ?
Кодировки файлов - это в доки/гугл nodejs. Я не в курсе что там для этого.
-
Кодировки файлов - это в доки/гугл nodejs. Я не в курсе что там для этого.
Там вот есть такая строчка:
fs.readFileSync(fileName, "utf8")
Очевидно у тебя не utf8 или utf8 не работает по какой-то причине.
-
Подскажите, пожалуйста, куда в node.js надо добавить строку, чтобы она в скомпилированно файле попала в первую строку?
Если в prolog добавляю, то в случае наличия require(RTL ...), она оказывается ниже него
Попробуй перед "if (rtlCodeWatcher.used())"
-
И еще у меня при выполнении ругается на отсутсвие exports . Это что-то глобальное для node?
Да, это, собственно, механизм экспорта. Если хочешь экспортировать в глобальное пространство - можешь попробовать прописать var exports = GLOBAL; (или какой там у тебя там глобал).
-
Кодировки файлов - это в доки/гугл nodejs. Я не в курсе что там для этого.
Там вот есть такая строчка:
fs.readFileSync(fileName, "utf8")
Очевидно у тебя не utf8 или utf8 не работает по какой-то причине.
Как-то надо победить. А то исходники в ANSI и при компиляции русские строки превращаются в крякозяблики (хотя может это надо делать не массив кодов, а массив символов) ?
-
Как-то надо победить. А то исходники в ANSI и при компиляции русские строки превращаются в крякозяблики (хотя может это надо делать не массив кодов, а массив символов) ?
Вообще русских буковок не бывает в ANSI... Я не в курсе твоей специфики, но я бы предлжил просто перегнать все в UTF8 (уже вроде все среды его держат). Но если UTF8 использовать нельзя, то посмотри тут как народ извращается: http://stackoverflow.com/questions/14551608/cant-find-encodings-for-node-js
-
Вообще русских буковок не бывает в ANSI... Я не в курсе твоей специфики, но я бы предлжил просто перегнать все в UTF8 (уже вроде все среды его держат). Но если UTF8 использовать нельзя, то посмотри тут как народ извращается: http://stackoverflow.com/questions/14551608/cant-find-encodings-for-node-js
Если я перегонял в utf8, то компилятор ругался сразу на 1ую строку 'syntax error' . Даже разбор не производил. Попробуй, пожалуйста, компилиться ли через "node oc_nodejs.js OutDir Module.ob". Если да, то попробую еще поразбираться.
На текущий момент изменил в nodejs.js кодировку чтения и сохранения на 'binary'. Исходники и выходные файлы получаются в ANSI. При этом русские буквы сохраняются. Вроде у меня в любых кодировках воспринимаются файлы (в крайнем случае в снегопате перекодирую в нужную мне, пока не пробовал, но думаю сработает)
-
И еще момент, или может я чего напутал, изменяя nodejs.js . Но не во всех файлах (модулях) создаются строки вида
var RTL$ = stdlib.require("RTL$.js").RTL$;
В результате ругается на отсутствие объекта RTL
Хотя может на это повлияло комментирование exports. ... ?
-
Вообще русских буковок не бывает в ANSI... Я не в курсе твоей специфики, но я бы предлжил просто перегнать все в UTF8 (уже вроде все среды его держат). Но если UTF8 использовать нельзя, то посмотри тут как народ извращается: http://stackoverflow.com/questions/14551608/cant-find-encodings-for-node-js
Если я перегонял в utf8, то компилятор ругался сразу на 1ую строку 'syntax error' . Даже разбор не производил. Попробуй, пожалуйста, компилиться ли через "node oc_nodejs.js OutDir Module.ob". Если да, то попробую еще поразбираться.
А результат перевода был с BOM или без BOM?
-
Если я перегонял в utf8, то компилятор ругался сразу на 1ую строку 'syntax error' .
Возможно там BOM надо откусывать сразу после чтения файла. Попробую, но потом.
На текущий момент изменил в nodejs.js кодировку чтения и сохранения на 'binary'. Исходники и выходные файлы получаются в ANSI. При этом русские буквы сохраняются. Вроде у меня в любых кодировках воспринимаются файлы (в крайнем случае в снегопате перекодирую в нужную мне, пока не пробовал, но думаю сработает)
Можно пока оставить binary - компилятору все равно, это важно прежде всего для редактирования.
-
И еще момент, или может я чего напутал, изменяя nodejs.js . Но не во всех файлах (модулях) создаются строки вида
var RTL$ = stdlib.require("RTL$.js").RTL$;
Это бага. Поправлю чуть позже.
-
Если я перегонял в utf8, то компилятор ругался сразу на 1ую строку 'syntax error' .
Вот это, наверное, оно: https://github.com/joyent/node/issues/1918
-
Если я перегонял в utf8, то компилятор ругался сразу на 1ую строку 'syntax error' .
Возможно там BOM надо откусывать сразу после чтения файла. Попробую, но потом.
А пока просто в редакторе указать чтобы сохранял без BOM и всего делов. :-)
-
А пока просто в редакторе указать чтобы сохранял без BOM и всего делов. :-)
Пробовал оба варианта, не прокатывало, еще раз буду пробовать позже
-
Подскажите, пожалуйста, куда ключевые слова добавить, чтобы он ругался, если их задействуешь в качестве идентификаторов?
-
Подскажите, пожалуйста, куда ключевые слова добавить, чтобы он ругался, если их задействуешь в качестве идентификаторов?
Так он же и так ругается! о_О Или у Вас есть код, на котором он не ругается?
-
Мне надо несколько новых ключевых слов добавить, чтобы он на них ругался тоже
-
Подскажите, пожалуйста, куда ключевые слова добавить, чтобы он ругался, если их задействуешь в качестве идентификаторов?
Поищи "reserverdWords".
-
Не сталкивались случайно, почему ругается на
commandString.search("\\")?
Хотя при этом делает
commandString.replace("\\", "/")
регулярные выражения здесь, буду в крайнем случае использовать, хотелось бы пока без них обойтись
-
И на примере подсовывания и строки и рег. выражения не подскажете, как прописать функцию биндинга, чтобы она принимала оба типа? Или это невозможно? Как каст делается?
-
Не сталкивались случайно, почему ругается на
commandString.search("\\")?
Наверное потому, что у строки нет метода search? Попробуй indexOf.
Хотя при этом делает
commandString.replace("\\", "/")
регулярные выражения здесь, буду в крайнем случае использовать, хотелось бы пока без них обойтись
Не обойдешься. Без регулярных выражений replace заменит тебе только первое вхождение. И это не то, чего обычно хотят нормальные люди - я по этому поводу уже возмущался :)
-
И на примере подсовывания и строки и рег. выражения не подскажете, как прописать функцию биндинга, чтобы она принимала оба типа? Или это невозможно? Как каст делается?
Не очень понял о чем речь. В обероне нет регулярных выражений. Так что и биндить вроде как нечего.
-
Не обойдешься. Без регулярных выражений replace заменит тебе только первое вхождение. И это не то, чего обычно хотят нормальные люди - я по этому поводу уже возмущался :)
Да, хотел в цикле по условию на search заменить через replace со строкой, но т.к. не победил ошибку, то через регулярки сделал. Кажется со вторым вопросом тоже разобрался. Пока снят
-
Я правильно понял, что если
есть типы:
Тип1
и
Тип2 (базовый Тип1)
То
можно присваивать
перемТип1 := перемТип2;
а наоборот нельзя?
-
И если правильно, то как можно заменить обратное присваивание?
-
Я правильно понял, что если
есть типы:
Тип1
и
Тип2 (базовый Тип1)
То
можно присваивать
перемТип1 := перемТип2;
а наоборот нельзя?
Переменной расширенного типа (в данном случае Тип2) нельзя присваивать значения базового типа (Тип1), иначе будет ошибка доступа к памяти при попытке обращения к полям типа Тип2, которых нет в типе Тип1.
Обратное присваивание -- логическая (или семантическая?) ошибка в программе.
-
И если правильно, то как можно заменить обратное присваивание?
А зачем это нужно? Приведите конкретную задачу...
-
И если правильно, то как можно заменить обратное присваивание?
А зачем это нужно? Приведите конкретную задачу...
Возможно только для биндинга (до другого еще пока не дошел)
Имеем, функцию (которую надо биндить), возвращающий разные объекты в зависимости от строкового параметра функции), хотелось бы оставить именно в виде одной функции, но судя по всему, придется делать отдельными функциями для каждого возвращаемого объекта
-
Имеем, функцию (которую надо биндить), возвращающий разные объекты в зависимости от строкового параметра функции), хотелось бы оставить именно в виде одной функции, но судя по всему, придется делать отдельными функциями для каждого возвращаемого объекта
Ну а в чём проблема? Расширяемые записи с этим вполне справятся...
Вот пример для акроновского компилятора оберона:
MODULE Records;
IMPORT RTL, In, Out;
TYPE
PBaseType = POINTER TO BaseType;
BaseType = RECORD END;
PIntVal = POINTER TO IntVal;
IntVal = RECORD (BaseType) value: INTEGER END;
PRealVal = POINTER TO RealVal;
RealVal = RECORD (BaseType) value: REAL END;
PCharVal = POINTER TO CharVal;
CharVal = RECORD (BaseType) value: CHAR END;
PROCEDURE Foo(x: INTEGER) : PBaseType;
VAR
ret : PBaseType;
int : PIntVal;
real: PRealVal;
char: PCharVal;
BEGIN
NEW(int); int .value := -123;
NEW(real); real.value := 3.14;
NEW(char); char.value := "a";
CASE x OF
| 1: ret := int
| 2: ret := real
| 3: ret := char
ELSE ret := NIL
END
RETURN ret
END Foo;
PROCEDURE Boo(x: PBaseType);
BEGIN
IF x IS PIntVal THEN
Out.String("[INTEGER] "); Out.Int (x(PIntVal) .value, 0)
ELSIF x IS PRealVal THEN
Out.String("[REAL] "); Out.Real(LONG(x(PRealVal).value), 0)
ELSIF x IS PCharVal THEN
Out.String("[CHAR] "); Out.Char(x(PCharVal).value)
ELSE
Out.String("NIL-value");
END
END Boo;
BEGIN
In.Open; Out.Open;
Out.String("x = 0, value = "); Boo(Foo(0)); Out.Ln;
Out.String("x = 1, value = "); Boo(Foo(1)); Out.Ln;
Out.String("x = 2, value = "); Boo(Foo(2)); Out.Ln;
Out.String("x = 3, value = "); Boo(Foo(3)); Out.Ln;
In.Ln
END Records.
-
О, спасибо, за понятный пример. А что получается, что при присваивании базовому типу расширенного, ему присваиваются и расширенные поля (те которые не входят изначально в базовый тип)?
-
...
Вот пример для акроновского компилятора оберона:
...
CASE x OF
| 1: ret := int
| 2: ret := real
| 3: ret := char
ELSE ret := NIL
END
...
Замечу, что это не Оберон - в Обероне нет варианта ELSE в CASE statement. См. грамматику. Все варианты должны быть перечислены явным образом.
-
О, спасибо, за понятный пример. А что получается, что при присваивании базовому типу расширенного, ему присваиваются и расширенные поля (те которые не входят изначально в базовый тип)?
Кстати да, пока речь идёт об указателях на записи -- всё понятно.
А как быть с записями-значениями?
MODULE test;
IMPORT JS;
TYPE
BaseRec = RECORD END;
Rec2 = RECORD (BaseRec) x : INTEGER END;
VAR
br : BaseRec;
r2 : Rec2;
BEGIN
r2.x := 42;
br := r2;
END test.
OberonJS это с удовольствием компилирует, но не происходит ли тут нарушения памяти?
-
...
Вот пример для акроновского компилятора оберона:
...
CASE x OF
| 1: ret := int
| 2: ret := real
| 3: ret := char
ELSE ret := NIL
END
...
Замечу, что это не Оберон - в Обероне нет варианта ELSE в CASE statement. См. грамматику. Все варианты должны быть перечислены явным образом.
Да, и правда, а как же быть в подобных случаях? о_О
-
У акроновского компилятора ещё и операция проверки типа отличается от описания последней ревизии оберона -- вторым параметром требует имя типа указателя на запись вместо имени типа записи...
Вот доработанная версия для OberonJS:
MODULE Records;
IMPORT JS;
TYPE
PBaseType = POINTER TO BaseType;
BaseType = RECORD END;
PIntVal = POINTER TO IntVal;
IntVal = RECORD (BaseType) value: INTEGER END;
PRealVal = POINTER TO RealVal;
RealVal = RECORD (BaseType) value: REAL END;
PCharVal = POINTER TO CharVal;
CharVal = RECORD (BaseType) value: CHAR END;
PROCEDURE Foo(x: INTEGER) : PBaseType;
VAR
ret : PBaseType;
int : PIntVal;
real: PRealVal;
char: PCharVal;
BEGIN
NEW(int); int .value := -123;
NEW(real); real.value := 3.14;
NEW(char); char.value := "a";
CASE x OF
| 1: ret := int
| 2: ret := real
| 3: ret := char
END
RETURN ret
END Foo;
PROCEDURE Boo(x: PBaseType);
BEGIN
IF x IS IntVal THEN JS.alert(x(PIntVal ).value)
ELSIF x IS RealVal THEN JS.alert(x(PRealVal).value)
ELSIF x IS CharVal THEN JS.alert(x(PCharVal).value)
ELSE JS.alert("Oops!");
END
END Boo;
BEGIN
Boo(Foo(0));
Boo(Foo(1));
Boo(Foo(2));
Boo(Foo(3))
END Records.
-
...
Вот пример для акроновского компилятора оберона:
...
CASE x OF
| 1: ret := int
| 2: ret := real
| 3: ret := char
ELSE ret := NIL
END
...
Замечу, что это не Оберон - в Обероне нет варианта ELSE в CASE statement. См. грамматику. Все варианты должны быть перечислены явным образом.
Да, и правда, а как же быть в подобных случаях? о_О
Или IF .. ELSEIF .. ELSE, или указывать диапазон покрывающий все остальные значения.
-
По поводу CASE - самое смешное, что если результат expression'a не соответствует ни одному из label, то программа спокойно продолжает работать. То есть HALT'а не будет:
x := 42;
CASE x OF
1: ret := int
| 2: ret := real
| 3: ret := char
END
Это абсолютно валидный рабочий код с точки зрения современного Оберона.
-
По поводу CASE - самое смешное, что если результат expression'a не соответствует ни одному из label, то программа спокойно продолжает работать. То есть HALT'а не будет:
x := 42;
CASE x OF
1: ret := int
| 2: ret := real
| 3: ret := char
END
Это абсолютно валидный рабочий код с точки зрения современного Оберона.
Ну а почему здесь должен быть HALT?
Ведь раз CASE OF просто синтаксических сахар для IF-ELSIF, то этот код эквивалентен такому:
x := 42;
IF x = 1 THEN ret := int
ELSIF x = 2 THEN ret := real
ELSIF x = 3 THEN ret := char
END
Тут же всё в порядке, ветка ELSE не является обязательной...
-
У акроновского компилятора ещё и операция проверки типа отличается от описания последней ревизии оберона -- вторым параметром требует имя типа указателя на запись вместо имени типа записи...
Не совсем так. В моей реализации первый и второй параметры должны соответствовать. Если первый параметр -- запись, то требуется имя типа-записи. В репорте написано:
v IS T stands for "v is of type T" and is called a type test. It is applicable, if
1. T is an extension of the declared type T0 of v, and if
2. v is a variable parameter of record type or v is a pointer.
Из этого не ясно, является ли тип T записью или указателем. И должен ли он соответствовать типу v.
-
OberonJS это с удовольствием компилирует, но не происходит ли тут нарушения памяти?
Копируется кусок объекта. Нормальная ситуация при условии понимания, что это именно то, чего ты хочешь.
-
OberonJS это с удовольствием компилирует, но не происходит ли тут нарушения памяти?
Копируется кусок объекта. Нормальная ситуация при условии понимания, что это именно то, чего ты хочешь.
А как же инварианты объектов? Они же вряд ли сохранятся при подобном частичном копировании...
-
А как же инварианты объектов? Они же вряд ли сохранятся при подобном частичном копировании...
Они сохраняются, если ты делаешь все в рамках правильного ООП - наследники специализируют базу, т.е. накладывают дополнительные инварианты (а не снимают базовые) - ты не наследуешь прямоугольник от квадрата и т.п.
-
Вот доработанная версия для OberonJS:
MODULE Records;
...
END Records.
Ну вот, вроде был понял, еще раз огромное спасибо
-
Почему то в моем коде RTL$.typeGuard не корректно отрабатывает. Какие функции, чтобы тип переменной вывести? typeof(переменная) или как то еще?
-
Может быть потому, что я не использую NEW для функции биндинга?
-
И еще момент, или может я чего напутал, изменяя nodejs.js . Но не во всех файлах (модулях) создаются строки вида
var RTL$ = stdlib.require("RTL$.js").RTL$;
В результате ругается на отсутствие объекта RTL
Фикснул. И RTL$.js теперь не генерится отдельно - используется rtl.js из исходников компилятора.
-
Может быть потому, что я не использую NEW для функции биндинга?
Попробуй привести код, на котором это видно. По твоему описанию непонятно, что там не так.
-
Попробуй привести код, на котором это видно. По твоему описанию непонятно, что там не так.
Сначала попробую переписать, как думаю будет правильно, если не поможет, тогда уточню
-
А в новой версии с NODE_PATH изменений не было, а то чё-то у меня выдает: системе не удалось найти указанный пусть?
-
Извиняюсь, я напутал, с путями все в порядке
-
Фикснул. И RTL$.js теперь не генерится отдельно - используется rtl.js из исходников компилятора.
Я правильно понял, что теперь оно постоянное (ну относительно конечно, пока новая версия не выйдет)?
-
Ругается, что нету RTL$.strToArray
Правда я в RTL закомментил строку где export присваивается. Это может быть связано?
-
Похоже связано, а как мне можно вместо exports присвоить самому скрипту методы переменной impl?
-
Вроде с експортом разобрался.
Но вот вопрос по охраннику типа остался.
У меня объект подменяется на объект яваскрипта (т.к. биндинг). И естественно он имеет другой тип. Мне отрубить охранника, или для биндингов не могу использовать присвоение указателю базового типа, указателя расширенного типа?
-
Или может там можно сделать так: "ИЛИ это тип Object яваскрипта"?
-
В общем подскажите, как это сделать "идеологически" правильнее (чтобы проверка типизации не нарушилась)
-
Но вот вопрос по охраннику типа остался.
У меня объект подменяется на объект яваскрипта (т.к. биндинг). И естественно он имеет другой тип. Мне отрубить охранника, или для биндингов не могу использовать присвоение указателю базового типа, указателя расширенного типа?
Если у тебя объект пришел из жабаскрипта и этот объект не был получен (в жабаскрипте) через Class.extend, то обероновские проверки типа к нему неприменимы. Потому что в жабаскрипте нет классов (о чем я писал). Классы (типы) искусственно создаются и поддерживаются в мирке oberonjs, все что пришло извне - никаких типов (в терминах оберона) не имеет.
-
Или может там можно сделать так: "ИЛИ это тип Object яваскрипта"?
Таки нужен код, чтобы понять, что у тебя происходит.
-
Или может там можно сделать так: "ИЛИ это тип Object яваскрипта"?
Таки нужен код, чтобы понять, что у тебя происходит.
Примерно следующее:
...
TYPE
Base = POINTER TO BaseRec;
BaseRec = RECORD END;
BaseExt = POINTER TO BaseExtRec;
BaseExtRec = RECORD (BaseRec)
run: PROCEDURE();
END;
VAR
v1: Base;
PROCEDURE getBase(): Base;
VAR
res: Base;
BEGIN
JS.do("res = JSObject";
END getBase;
BEGIN
v1 := getBase();
v1(BaseExt).Run();
...
здесь
для v1(BaseExt).Run() при выполнении прозводится проверка типа (через RTL). Которая не проходит. Ты уже объяснил почему. Вопрос: можно ли как-то изменить эту проверку? Или выход только один, написать для каждого типа getBaseExt... ?
-
Вопрос: можно ли как-то изменить эту проверку?
Можно пойти до конца и подменить сгенерированное для оберона объявление типа на жабоскриптовое:
JS.do("BaseExtRec = SomeJSClass");
У меня заработало.
-
Можно пойти до конца и подменить сгенерированное для оберона объявление типа на жабоскриптовое:
JS.do("BaseExtRec = SomeJSClass");
У меня заработало.
А это сработает, если это будет ole объект (или как он там называется), а не объект JS ? И может быть имеет сделать смысл какой-то префикс (навероде [winapi] у КП) процедуры или объекта, сообщающие, что они содержат объект, который не надо проверять?
P.S. Похоже я чего-то не так делаю, не сработало, позже буду еще разбираться
-
Или при этом защиту типа тоже надо изменить?
-
А это сработает, если это будет ole объект (или как он там называется), а не объект JS ?
Это сработает, если сработает жабаскриптовый "x instanceof ClassX" - общепринятый в жабаскрипте способ проверки типа.
И может быть имеет сделать смысл какой-то префикс (навероде [winapi] у КП) процедуры или объекта, сообщающие, что они содержат объект, который не надо проверять?
Ты и так может вызывать что угодно не проверяя через JS.anyObject.anyMethod(). Возможно такое же поведение надо сделать для переменных JS.var.
-
а объекты nodejs можно ли как нибудь вызывать как функции dll . Или только можно запустить локально веб-сервер на nodejs, и к нему обращаться через http-запросы (подобное я пока не осилю)?
Снегопат судя по всему использует движок JS, который используется и internt explorer ом в винде (вроде бы этот же движок используется и windows script host).
Вот и хотелось бы как-то из скриптов на этом движке, взаимодействовать со скриптами на nodejs (желательно без http запросов). Или может быть данные запросы не очень сложны в написании?
-
Да, честно скажу, что писать на обероне мне намного тяжелее, чем на 1С . Но некоторые преимущества типизации видны невооруженным взглядом :) . Действительно, уже на этапе компиляции большая часть ошибок выдается.
Понимаю, почему процедуры на обероне должны быть короткими (малострочными): чтобы была видна в них секция VAR: какого типа переменные используются. Исходя из типа уже обычно смысл переменных виден. Названия самих переменных можно и удобнее (без автокомплита), делать короче. Читабельность при этом не сильно страдает (хотя в 1С короткие переменные сводили бы с ума :) , хотя реально код "захламляют"). Хотя в 1С тоже "желательны" короткие процедуры, но оберон сам по себе, да еще и без автокомплита, очень этому способствует.
-
Какие-то манипуляции в Notepad++ (правда не последней версии) в виндовс 8, выдали окно ошибки (даже несколько), причем никакие манипуляции мышкой не смогли его закрыть. Через диспетчер задач, тоже не удалось, одно из окон нотепада всегда было поверх остальных.
Возможно помогл бы выбор на панели окон "закрыть окно", но теперь уже проверить не могу, т.к. закрыл через альт+ф4.
Вот так хваленая винда 8 (понимаю конечно что виноват нотепад, но тем не менее).
-
а объекты nodejs можно ли как нибудь вызывать как функции dll . Или только можно запустить локально веб-сервер на nodejs, и к нему обращаться через http-запросы (подобное я пока не осилю)?
Ничего не могу сказать - читай доки по nodejs.
Снегопат судя по всему использует движок JS, который используется и internt explorer ом в винде (вроде бы этот же движок используется и windows script host).
Вот и хотелось бы как-то из скриптов на этом движке, взаимодействовать со скриптами на nodejs (желательно без http запросов). Или может быть данные запросы не очень сложны в написании?
Не очень понимаю зачем тебе взаимодействие между двумя джаваскриптовыми движками. Что мешает все это запускать под одним снегопатом?
-
Не очень понимаю зачем тебе взаимодействие между двумя джаваскриптовыми движками. Что мешает все это запускать под одним снегопатом?
Хотел бы логику сделать на nodejs, а в снегопате чисто интерфес (чтобы потом можно было безболезненно переделать интерфес уже чисто на веббраузер). Наверное для этого все же надо будет разобраться в http запросах (или чем еще, чтобы веб сервер сделать).
-
Вот тут есть примеры каких-то настрольных веб-приложений, похоже так можно будет сделать.
http://habrahabr.ru/qa/47986/
Значит позже начну разбираться
-
а подскажите, пожалуйста, есть ли в компиляторе код/объект, который бы мог использоваться для создания автокомплита по оберону?
-
Как всегда глупый вопрос:
Можно ли каким-то образом передавать в процедуру переменную (или что это такое) модуля?
-
КП в плане того, что процедуры не надо присваивать, удобнее конечно
-
Хотел бы логику сделать на nodejs, а в снегопате чисто интерфес (чтобы потом можно было безболезненно переделать интерфес уже чисто на веббраузер). Наверное для этого все же надо будет разобраться в http запросах (или чем еще, чтобы веб сервер сделать).
Все равно не понял. Пиши логику без завязок на специфику снегопата, зачем для этого nodejs Почему это проблема? Что есть в nodejs из того, чего нет в снегопате?
-
Да, честно скажу, что писать на обероне мне намного тяжелее, чем на 1С . Но некоторые преимущества типизации видны невооруженным взглядом :) . Действительно, уже на этапе компиляции большая часть ошибок выдается.
Ну на тебя еще сваливаются все проблемы первопроходцев :) Отсутствие готовых биндингов и глюки.
-
а подскажите, пожалуйста, есть ли в компиляторе код/объект, который бы мог использоваться для создания автокомплита по оберону?
Пока нет. Но хочется. Когда-нибудь будет, если проект не загнется :)
-
КП в плане того, что процедуры не надо присваивать, удобнее конечно
Да, процедуры будут добавлены одними их первых в расширение языка. Хотя бы по по образу и подобию КП.
-
В текущей версии жабаскриптовые строки можно не конверить в массив при передаче как ARRAY OF CHAR - будет работать.
PROCEDURE f*(s: ARRAY OF CHAR);
...
var s = "abc";
oberonModule.f(s);
Также можно попробовать поддержать обратный сценарий (если надо) - чтобы обероновский ARRAY OF CHAR выглядел для жабаскрипта почти как строка (перегрузить toString в rtl.js).
VAR s: ARRAY 10 OF CHAR;
BEGIN
s := "abc";
JS.alert(s);
-
JS.alert(s);
Cейчас показывает 97,98,99,0,0,0...
-
Подскажите, пожалуйста, как исключения обрабатываются? Или ключевые слова, которые по этому поводу посмотреть. Или подобного вообще нет?
-
Подскажите, пожалуйста, как исключения обрабатываются? Или ключевые слова, которые по этому поводу посмотреть. Или подобного вообще нет?
Будет после методов ;) Пока можно кидать и ловить из жабаскрипта.
-
Ладно, пока жабаскриптом буду.
Такой вопрос, не нашел как объявлять форвардные объявления процедур. Или это уже не требуется?
-
Такой вопрос, не нашел как объявлять форвардные объявления процедур. Или это уже не требуется?
Вирт выпилил. Если есть взаиморекурсивные процедуры - то только через дополнительную процедурную переменную.
-
А где нибудь есть описание стандартных библиотек (чтобы реализацию для снегопата можно было бы использовать и в других средах)?
Наверное поэтому вопрос и возник, по поводу написания логики с использованием node. Чтобы потом можно было использовать код и в браузере.
Сейчас вижу, что достаточно реализовывать стандартные библиотеки, и работать через них. Чтобы потом также легко перейти на браузер.
-
Вирт выпилил. Если есть взаиморекурсивные процедуры - то только через дополнительную процедурную переменную.
Ясно.
А при этом процедурное переменной можно присваивать только процедуры текущего модуля? А то пытаюсь присвоить из другого, выдает ошибку
-
Кстати, судя по ответу на оберонкоре, там исключение вроде как через системную библиотеку сделано, здесь наверное тоже самое надо.
Может приведете, интерфейс (чтобы на яваскрипте пока у себя написал)
-
А при этом процедурное переменной можно присваивать только процедуры текущего модуля? А то пытаюсь присвоить из другого, выдает ошибку
Можно:
MODULE test1;
TYPE
Proc* = PROCEDURE(x: INTEGER): INTEGER;
VAR
proc: Proc;
PROCEDURE SetProc*(p: Proc);
BEGIN
proc := p;
END SetProc;
PROCEDURE TestProc*(x: INTEGER): INTEGER;
BEGIN
RETURN proc(x)
END TestProc;
END test1.
MODULE test;
IMPORT JS, test1;
PROCEDURE Add1(x: INTEGER): INTEGER;
BEGIN
RETURN x + 1
END Add1;
PROCEDURE Mul2(x: INTEGER): INTEGER;
BEGIN
RETURN 2 * x
END Mul2;
PROCEDURE Sqr(x: INTEGER): INTEGER;
BEGIN
RETURN x * x
END Sqr;
BEGIN
test1.SetProc(Add1); JS.alert(test1.TestProc(5));
test1.SetProc(Mul2); JS.alert(test1.TestProc(5));
test1.SetProc(Sqr); JS.alert(test1.TestProc(5))
END test.
-
Я делал как-то так:
MODULE test;
PROCEDURE Add1*(x: INTEGER): INTEGER;
BEGIN
RETURN x + 1
END Add1;
BEGIN
END test.
MODULE test1;
IMPORT JS, test;
TYPE
Proc* = PROCEDURE(x: INTEGER): INTEGER;
VAR
proc: Proc;
PROCEDURE SetProc*(p: Proc);
BEGIN
proc := p;
END SetProc;
BEGIN
SetProc(test.Add1);
JS.alert(Proc(5));
END test1.
Сейчас тоже ошибка выдается, но как-то по другому
-
Наверное как всегда глупость сделал, позже попробую разобраться сам
-
Я делал как-то так:
MODULE test;
PROCEDURE Add1*(x: INTEGER): INTEGER;
BEGIN
RETURN x + 1
END Add1;
BEGIN
END test.
MODULE test1;
IMPORT JS, test;
TYPE
Proc* = PROCEDURE(x: INTEGER): INTEGER;
VAR
proc: Proc;
PROCEDURE SetProc*(p: Proc);
BEGIN
proc := p;
END SetProc;
BEGIN
SetProc(test.Add1);
JS.alert(Proc(5));
END test1.
Сейчас тоже ошибка выдается, но как-то по другому
В строке
JS.alert(Proc(5));
указано имя типа вместо имени процедуры. Надо так:
JS.alert(proc(5));
-
А где нибудь есть описание стандартных библиотек (чтобы реализацию для снегопата можно было бы использовать и в других средах)?
Стандартных библиотек чего? Если oberonjs - то еще не написали :) Если nodejs - то nodejs.org.
-
Кстати, судя по ответу на оберонкоре, там исключение вроде как через системную библиотеку сделано, здесь наверное тоже самое надо.
Может приведете, интерфейс (чтобы на яваскрипте пока у себя написал)
Можно посмотреть как здесь сделано: https://github.com/vladfolts/oberonjs/blob/master/src/oberon/Errors.ob#L6
Что касается try/catch, то пока можно отбиться JS вставками:
JS.do("try {");
JS.do("throw new Error('test')");
JS.do("} catch (x) { error = x; }");
-
указано имя типа вместо имени процедуры. Надо так:
Завел баг на диагностику: https://github.com/vladfolts/oberonjs/issues/40
-
Стандартных библиотек чего? Если oberonjs - то еще не написали :) Если nodejs - то nodejs.org.
Ну скажем не библиотек, а требований к ним (и желательно интерфейса, которого придерживаться)
-
В строке
JS.alert(Proc(5));
указано имя типа вместо имени процедуры. Надо так:
JS.alert(proc(5));
А еще, переменную можно так задавать?
VAR
p: PROCEDURE ()
-
Что-то это вроде уже обсуждалось, но не смог найти.
Я правильно понял, что нельзя после вызова процедуры писать через точку?
Например так:
Функция1().Функция2().значение
Если да, то почему?
Это не приравнивается разыменованию?
-
Ну скажем не библиотек, а требований к ним (и желательно интерфейса, которого придерживаться)
Ну мы тут обсуждали стиль и табы. А так - надо сначала написать, потом можно покритиковать...
-
А еще, переменную можно так задавать?
VAR
p: PROCEDURE ()
Можно. Почему нет?
-
Что-то это вроде уже обсуждалось, но не смог найти.
Я правильно понял, что нельзя после вызова процедуры писать через точку?
Например так:
Функция1().Функция2().значение
Если да, то почему?
Нельзя. Вирту не нужно было - вот он и не сделал. Низкоуровневый подход - обычно надо обработать результат вызова процедуры и подготовиться к вызову следующей. В отсутствие исключений практически каждый вызов может завершиться возвратом ошибки, которую надо обработать. Поэтому такой случай вызовов подряд - довольно редок. Глубокой идеи тут никакой нет.
-
Поэтому такой случай вызовов подряд - довольно редок. Глубокой идеи тут никакой нет.
Не это ли и есть глубокая идея Оберона?
-
Поэтому такой случай вызовов подряд - довольно редок. Глубокой идеи тут никакой нет.
Не это ли и есть глубокая идея Оберона?
Да, это глубокая идея оберона. Я просто хотел акцентировать то, что за пределами оберона в его текущем состоянии это может быть вполне нормальный конструкт. В отличие, например, от goto и прочих неструктурных ужасов, которые были выпилены из оберона намеренно.
-
Поэтому такой случай вызовов подряд - довольно редок. Глубокой идеи тут никакой нет.
Не это ли и есть глубокая идея Оберона?
Отсутствие глубоких идей?
-
Отсутствие глубоких идей?
Давайте не будем портить тему.
-
Что-то или я чего натворил, или до этого не заметил (как-то упустились подробности).
Но использую такой код:
IObject1C* = RECORD (Js.ObjectRec) END;
Компилируется в такой:
var IObject1C = ObjectRec.extend({
Причем при выполнении ругается, что нету ObjectRec. Не могли бы проверить? Может конечно я чего-лишнего в компиляторе закомментил.
-
кстати, рассылку об обнолении компилятора как нить можно получить?
-
Компилируется в такой:
var IObject1C = ObjectRec.extend({
Это бага, буду фиксить.
-
Это бага, буду фиксить.
Починил в ветке "release". Проведу в основную чуть позже.
-
Как использовать релиз? Заменил файлы, у меня перестало компилиться, в nodejs.js ругается на oc.js (что нет метода compileModules). Изменил на compileModule, стало ругаться на еще чего то.
Или релиз отличается от основной ветки? Ладно, подожду основуню
-
Или релиз отличается от основной ветки? Ладно, подожду основуню
Релиз - стабильная ветка, там нет поддержки компиляции nodejs.
Слил с основной - пробуй.
-
кстати, рассылку об обнолении компилятора как нить можно получить?
Там на гитхабе есть "watchers" и "stargazers" - поэкспериментируй, наверное это оно.
-
Там на гитхабе есть "watchers" и "stargazers" - поэкспериментируй, наверное это оно.
Это региться надо обязательно?
Не нашел такого, если можно, ссылку или скрин
-
Со строками чё-нибудь делалось, чё то у меня перестало работать, что раньше работало? (вроде перестало преобразовываться в массив)
-
Это региться надо обязательно?
Не нашел такого, если можно, ссылку или скрин
Приаттачил. Наверное надо регистрироваться.
-
Да, похоже региться надо, ладно позже попробую зарегисться
Как теперь работать со строками (константами и прочим)? Какие операции будут поддерживаться, ( а то я до этого с ними через объект яваскрипта рабоатл)?
-
Как теперь работать со строками (константами и прочим)? Какие операции будут поддерживаться, ( а то я до этого с ними через объект яваскрипта рабоатл)?
Э... Что значит "работать"? Никаких расширений языковых я не делал специально для строк.
-
Хорошо, попробую, пока поработаю, по строкам пока вопросы снимаю, будут конкретные, тогда и задам
-
Пытаюсь присвоить процедурному полю процедуру. Выдает ошибку:
File "D:\GoogleDisk\_snegopat\scripts\Oberon\SnegAPI.ob", line 352: type mismatc
h: 'res.RunApp' is
'PROCEDURE(ARRAY OF CHAR, ARRAY OF CHAR, BOOLEAN, VAR INTEGER)' and cannot be assigned to
'PROCEDURE(ARRAY OF CHAR, ARRAY OF CHAR, BOOLEAN, VAR INTEGER)' expression
Чего не так делаю? До этого работало
-
Правда ранее там в параметрах были не ARRAY OF CHAR, а Js.String
-
Чего не так делаю? До этого работало
Все правильно делаешь. Починил :)
-
Елки, до этого функцией возвращал указатель на строку, а теперь надо как то возвращать массив символов. Или это только через параметр-переменную можно?
-
Похоже поспешил переделывать параметры на ARRAY OF CHAR (с яваскрипт строкой проще было работать).
Или подскажите, как функцией можно вернуть ARRAY OF CHAR ? (пусть даже через поле записи, но такие поля тоже задаются жестко заданного размера)
-
Чё-то без динамического массива я "стушевался" :)
-
Пока вернул всё "взад" :) . Вопросы по строкам снимаются
Еще раз, напомните, пожалуйста, чего-то найти не смогу, как задать тип/переменную, чтобы по ней не делалась проверка типа (т.к. объекты относятся к внешним объектам по отношению к оберону).
-
И по прежнему: при указании в качестве базового типа из другого модуля имеем следующее:
var IObject1C = Js.ObjectRec.extend({
init: function IObject1C(){
ObjectRec.prototype.init.call(this);
}
});
Js.ObjectRec у нас имеется, а ObjectRec нет.
-
Хотя не исключаю, что я чего-то недообновил
-
Кажется на что-то другое у меня ругается, пока вопрос снимаю, если что, позже уточню
-
ilovb, не подскажешь, какая кодировка в виде строки, соответсвует ANSI в текстовом документе ?
-
Если про сишную локаль (гуглить "isalpha"), то так ".1251"
-
Пока вернул всё "взад" :) . Вопросы по строкам снимаются
Да, работа со строками в обероне - для суровых последователей :)
Еще раз, напомните, пожалуйста, чего-то найти не смогу, как задать тип/переменную, чтобы по ней не делалась проверка типа (т.к. объекты относятся к внешним объектам по отношению к оберону).
Было как-то так:
TYPE T = RECORD END;
...
JS.do("T = JavaScriptType");
-
И по прежнему: при указании в качестве базового типа из другого модуля имеем следующее:
var IObject1C = Js.ObjectRec.extend({
init: function IObject1C(){
ObjectRec.prototype.init.call(this);
}
});
Js.ObjectRec у нас имеется, а ObjectRec нет.
Недофиксал. Поправлю, но чуть позже.
-
И по прежнему: при указании в качестве базового типа из другого модуля имеем следующее:
Js.ObjectRec у нас имеется, а ObjectRec нет.
Недофиксал. Поправлю, но чуть позже.
Поправил.
-
Было как-то так:
TYPE T = RECORD END;
...
JS.do("T = JavaScriptType");
Кажется у меня тот вариант не сработал (т.к. JavaScriptType внешний даже по отношению к яваскрипту как это правильно, com-объект что-ли). Позже еще раз попробую конечно.
-
Или яваскрипт позволяет расширять com-объекты?
-
Кажется у меня тот вариант не сработал (т.к. JavaScriptType внешний даже по отношению к яваскрипту как это правильно, com-объект что-ли). Позже еще раз попробую конечно.
Тут тебе надо покопать на тему того как работает instanceof в JS (забористая трава, сам никак не могу до конца вкурить). Потому что компилятор ничего умного не делает, кроме этого instanceof для проверки типа.
-
Или яваскрипт позволяет расширять com-объекты?
Что ты понимаешь под "расширять com-объекты"? COM оперирует только наследованием интерфейсов. COM-объект - это объект с определенным набором интерфейсов. Его можно или использовать непосредственно или агрегировать. Вроде все (давно это было).