Естественно, выпадающие списки - рулят во всех местах...
![Smile :)](./images/smilies/icon_smile.gif)
Модуль - именно в компонентном смысле Компонентного паскаля. То есть они загружаются динамически и связываются в процессе загрузки (хотя многомодульность только сейчас начинаем писать).
Однако отличие в том, что мы использовали секцию инициализации в стиле для написания программы.
Как у Инфо-21 в школьной сборке. Если прога одномодульная, то можно прогу прямо там и писать.
Либо написать процедуру, а в инициализации поставить просто вызов этой процедуры.
Модуль при загрузке сразу исполняет эту секцию, поэтому нам пока не потребовался коммандер.
Вот пример:
Код:
модуль НовыйМодуль
начало
вывести "Привет, Мир!";
конец НовыйМодуль.
Вообще с языком мы поступили так. Изначально делали две лексики: русскую и английскую. Все ключевые слова.
В редакторе просто есть кнопочка Русский-Английский. И все ключевые слова меняются.
Код:
module НовыйМодуль
start
output "Привет, Мир!";
end НовыйМодуль.
Более того, реализация позволяет нам переключаться даже между стилем синтаксиса: паскалевский - сишный.
Это еще не реализовано, но все пути четко видны. Просто не первоочередная задача.
Пока у нас более паскалевский синтаксис, достаточно многословный. Но поскольку ничего вручную не набирается, а вставляется целиком редактором, то проблем и неприятия многословность не вызывает.
Напротив, текст становится более читабельным.
Код:
модуль Factorial
начало
переменная целое i := 1;
переменная целое current := 1;
константа целое N = 10;
пока i < N повторять
присвоить current := current * i;
присвоить i := i + 1;
вывести current;
вывести '\n';
конец цикла;
конец Factorial.
А вот как пока это выглядит в сохраняемом виде:
Цитата:
<?xml version="1.0" encoding="utf-16"?>
<Module NameWord="Factorial">
<Beginning>
<VariableWithInit NameWord="i" Type="целое" Expression="Operand$1;"></VariableWithInit>
<VariableWithInit NameWord="current" Type="целое" Expression="Operand$1;"></VariableWithInit>
<Constant NameWord="N" Type="целое" Expression="Operand$10;"></Constant>
<NullOperator KeyWord="
"></NullOperator>
<While Expression="Operand$i;Space$ ;BinaryOperation$<;Space$ ;Operand$N;">
<Assign RightValue="Operand$current;Space$ ;BinaryOperation$*;Space$ ;Operand$i;" LeftValue="Operand$current;"></Assign>
<Assign RightValue="Operand$i;Space$ ;BinaryOperation$+;Space$ ;Operand$1;" LeftValue="Operand$i;"></Assign>
<Output Expression="Operand$current;"></Output>
<Output Expression="Operand$'\n';"></Output>
</While>
</Beginning>
</Module>
Естественно, данный файл можно относительно легко конвертировать в текст на некоем языке программирования и скомпилировать его соответствующим компилятором - это если нужен отдельный exe-модуль. Пока мы этим не занимаемся. Есть более важные и интересные задачи.
Далее - оператор вставляется при наборе снипета - и тут тоже список выпадает, можно выбрать.
Во вставленном операторе можно вводить символы только в строго ограниченных местах.
Каждый оператор имеет финальный end - как в Компонентном паскале.
Со вводом-выводом пока поступили просто - в языке два простейших оператора: ввести, вывести.
Потом будем думать об отдельном модуле уже на нашем модуле.
Самое интересное.
Мы ввели тег "текст". Теперь в том же окне модуля мы можем (вне программного модуля) работать как в обычном редакторе. Таким образом, мы получаем возможность подготовить текст справки непосредственно в нашем редакторе. И соответственно готовить задания и вообще обучающие материалы вместе с примерами программ без привлечения дополнительных средств. Тут еще много технической работы, но принципиально уже все решаемо.
Тем более, что среди компонентов SilverLight заготовка редактора уже есть...
![Smile :)](./images/smilies/icon_smile.gif)
Интересные вещи выяснились при реализации интерпретатора. Наш модуль - это список узлов-операторов, каждый из которых может иметь вложенный список узлов. В это семантическое дерево текст вставляется просто как неинтерпретируемый узел...
Когда пацан писал реализацию копирования, встал законный вопрос: поверхностное или глубокое копирование объектов.
Выяснилось, что отличия (в его модели памяти) - только в одной процедуре.
Теперь у нас есть в редакторе кнопочка: копируемый-ссылочный. В первом случае для всех объектов языка (и для массивов тоже) копирование - глубокой. Во втором случае - идеология Ява-Додиез: элементарные типы данных копируются, а для объектов - копируются ссылки.
Пока все.