Коль у меня после апгрейда 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.
Ну а теперь объясните мне - нафига это нововведение в компиляторе было сделано? :-)