Предполагается, что данный подход сильно упростит построение графов достижимости компилятором, а в будущем позволит также изолировать транзакции друг от друга и соблюдать транзакционную целостность.
Прием, чистота, мутация
Параметры функций в Канторе делятся на три вида — по способу доступа к ним:- Входные параметры не имеют ключевого слова. Функция, имеющая только входные параметры, является приемником. Будучи описанной внутри класса, функция-приемник становится свойством-приемником и получает возможность изменять контекст класса или объекта.
- Выходные параметры обозначаются ключевым словом out. Наличие хоть одного выходного параметра делает функцию чистой и запрещает изменять контекст класса или объекта, если функция описана как свойство.
- Мутирующие параметры или параметры-переменные обозначаются ключевым словом var. Наличие хоть одного мутирующего параметра делает всю функцию мутирующей — позволяет ей изменять контекст (как для приемника), но делает невозможным обращение к функции при помощи оператора присваивания, разрешая только общий вызов. Наличие var-параметров имеет наивысший приоритет при определении вида функции.
Именованные и анонимные параметры
Параметры функций могут быть как именованными, так и анонимными. Анонимными чаще всего являются out-параметры чистых функций, поскольку их реализация может быть описана или одним выражением, или при помощи оператора return, возвращающего значения позиционно и анонимно.Пример с числом Авогадро из предыдущей статьи может быть записан в эквивалентных формах с ключевым словом out:
out avogadro = 6.022e23; // неявный анонимный параметр avogadro(out) = 6.022e23; // явный анонимный параметрФорма с параметром в скобках является номинативной — именно так хранится функция в байт-коде. Прочие формы записи — синтаксический сахар.
Функция подсчета молярной массы, имеющая входной параметр, в полной форме будет выглядеть так:
mole(out; :Core:Real atomicWeight) = atomicWeight * avogadro;Несмотря на наличие входного параметра
atomicWeight
, анонимный выходной параметр делает ее чистой, out-функцией.Обе функции можно записать в эквивалентной форме с оператором return:
avogadro(out) of return 6.022e23; end; mole(out; :Core:Real atomicWeight) of return atomicWeight * avogadro; end;В байт-коде все формы записи идентичны, при отекстовке можно будет выбрать предпочитаемую.
Комментариев нет :
Отправить комментарий
Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.
Примечание. Отправлять комментарии могут только участники этого блога.