Естественно, выпадающие списки - рулят во всех местах...
Модуль - именно в компонентном смысле Компонентного паскаля. То есть они загружаются динамически и связываются в процессе загрузки (хотя многомодульность только сейчас начинаем писать).
Однако отличие в том, что мы использовали секцию инициализации в стиле для написания программы.
Как у Инфо-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 заготовка редактора уже есть...
Интересные вещи выяснились при реализации интерпретатора. Наш модуль - это список узлов-операторов, каждый из которых может иметь вложенный список узлов. В это семантическое дерево текст вставляется просто как неинтерпретируемый узел...
Когда пацан писал реализацию копирования, встал законный вопрос: поверхностное или глубокое копирование объектов.
Выяснилось, что отличия (в его модели памяти) - только в одной процедуре.
Теперь у нас есть в редакторе кнопочка: копируемый-ссылочный. В первом случае для всех объектов языка (и для массивов тоже) копирование - глубокой. Во втором случае - идеология Ява-Додиез: элементарные типы данных копируются, а для объектов - копируются ссылки.
Пока все.