В этой теме я хотел бы выкладывать некоторые задумки и реальные механизмы, которые используются в языке и в его реализации.
Итак, небольшая схемка, общий принцип работы:
Исходный текст программы будет переводится во внутреннее представление виртуальной машины. Имеется возможность оттуда сохранить состояние машины (чисто теоретически вообще любое, не только во время старта) и загрузить данные в форме P-кода. По сути это такая же программа, но язык которой сильно бедней в плане синтаксиса (соответственно требуется меньше проверок во время загрузки/старта).
Ну и соответственно виртуальная машина проводит вычисления в рамках модели систем.
Вопрос по организации передачи параметров в функцию.
Итак, возьмем абстрактный вызов (поскольку синтаксис стандарта еще не определен, весь пример условный):
х=какая_то_функция(параметр1[тип<>''], параметр2[параметр2>0], параметр3)[тип='список']
Что тут происходит? Переменной (которая тоже система между прочим) передается результат работы функции какая_то_функция. На функцию наложены ограничения предусловий (для входящих параметров) и постусловие (для результата) с помощью спецификаторов. Функция получает 3 параметра:
- параметр1 (у которого при передачи тип должен отличаться от пустой строки);
- параметр2 (который должен восприниматься как простая система с текстовым значением, воспринимаем как число больше нуля);
- параметр3 (на который не наложено никаких ограничений и он может быть любой системой - простой, функцией, определенной пользователем и т.д.).
При этом параметры копируются и соответственно на сами системы, которые переданы в функцию, она повлиять не в состоянии. Все что ей позволено это результат и побочные эффекты. При этом функция получит локальные копии параметров, над которыми может делать все что пожелает.
Затем синтаксис вызова определяет, что функция должна вернуть значение, имеющее тип список.
Теперь возникает вопрос по реализации параметров внутри функции. Пока идея следующая, создать подсистему, которая по умолчанию будет существовать у функций, как служебная подсистема, хранящая локальные копии параметров.
Ну вот как-то так:
Согласно данной модели, здесь пока что условно, после проверки контракта (всех условий для входящих параметров), в функции создается подсистема #, в которую будут копироваться входящие параметры (под именами, определенными в сигнатуре функции при ее описании в коде программы). А в качестве результата будет генерироваться подсистема с таким же именем, что и имя функции. После выхода из функции, будет произведена проверка постусловия (что тип результата должен быть "список") и затем скопирован в переменную х. Как вариант результат функции тоже можно размещать #, однако существует вероятность вложенного вызова самой себя в качестве одного из параметров, поэтому я думал о размещения входных параметров и результата в разных подсистемах.
Как идея? Предлагайте варианты, пишите замечания.
Вообще, чисто теоретически, после отладки функции смысл в передачи кучи параметров отпадает сам собой, так как у программиста существует возможность запихнуть все системы-параметры в одну и передавать ее функцию (сейчас вопрос производительности не стоит, понятно, что практически это медленно, но еще неизвестно что медленней - передавать параметры по одному (и проверять корректность при входе в функцию каждого параметра) или передать все сразу в виде большой системы). Это свойство возникает из-за такого явления как алгебраические типы данных (АТД, не путать с абстрактными типами данных!!!!), суммирование типов в Валентине есть "из коробки" - их представляет теория систем и базовые операции для работы с подсистемами. Вопрос по произведению типов пока в стадии продумывания...
И еще размышления - сейчас продумывая возврат результатов функций я прихожу к мысли, что вселенная это больше чем система с именем '1'... Вполне вероятно, что данная система будет иметь несколько подсистем (например, список внешних модулей), вероятно вселенная внутри будет иметь еще подсистемы, которые будут недоступны напрямую программисту, но будут необходимы для поддержания функциональности модели.