Рассмотренная ранее трактовка параметров функций в Канторе объединяет понятие вызова функции с трактовкой порожденных функций как синонимов. На уровне модели (байт-кода) обобщенная форма обращения к функциям носит название общего вызова.
Обращение к чистым функциям, четко разделяемое на левую и правую части, может быть записано в альтернативной, более привычной форме, — при помощи оператора сопоставления (знака равенства). Форма записи в виде оператора сопоставления называется в Канторе чистым вызовом.
Упоминание общего и чистого вызова уже встречалось в статье про параметры, но их раскрытие было временно отложено с расчетом описать в отдельной статье, которую вы сейчас и читаете.
26 января 2014 г.
16 января 2014 г.
Параметры функций
Концепция параметров функций в Канторе довольно сильно отличается от общепринятой как в теории, так и на практике. Виновница несовместимости — фрактальная модель, в рамках которой переменные и функции объединились в одну сущность, а доступ к параметрам идет не по значению и ссылке, а на прием, возврат и мутацию, что отдаленно напоминает концепцию триггеров в СУБД.
Предполагается, что данный подход сильно упростит построение графов достижимости компилятором, а в будущем позволит также изолировать транзакции друг от друга и соблюдать транзакционную целостность.
Пример с числом Авогадро из предыдущей статьи может быть записан в эквивалентных формах с ключевым словом out:
Функция подсчета молярной массы, имеющая входной параметр, в полной форме будет выглядеть так:
Обе функции можно записать в эквивалентной форме с оператором return:
Предполагается, что данный подход сильно упростит построение графов достижимости компилятором, а в будущем позволит также изолировать транзакции друг от друга и соблюдать транзакционную целостность.
Прием, чистота, мутация
Параметры функций в Канторе делятся на три вида — по способу доступа к ним:- Входные параметры не имеют ключевого слова. Функция, имеющая только входные параметры, является приемником. Будучи описанной внутри класса, функция-приемник становится свойством-приемником и получает возможность изменять контекст класса или объекта.
- Выходные параметры обозначаются ключевым словом 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;В байт-коде все формы записи идентичны, при отекстовке можно будет выбрать предпочитаемую.
15 января 2014 г.
Функции как синонимы
Реализация функциональной парадигмы в Канторе испытала сильное влияние SQL. SQL-запросы истолкованы автором как чистые функции, синонимы внутри select — как замыкания, а сам SQL признан самым популярным языком функционального программирования и годным источником заимствований. Простота объявления локальных имен, взятая из SQL, получила условное наименование программирования через синонимы.
Использование синонимов оставляет у программиста ментальное ощущение легкости и удобства, которое неплохо бы перенести в другие языки.
Как принято в функциональных языках, тип результата функции может быть опущен, что задействует вывод типов компилятором. В нашем примере функция
В SQL аналогом переменных являются таблицы, а аналогом переменных с начальным значением — материализованные представления, состоящие из таблицы и связанного с ней представления одновременно.
Синонимы в SQL
Программиста на любом императивном языке, будь то Паскаль или Си, поначалу удивляет простота объявления синонимов полей и таблиц в запросах и командах SQL:select a.code, b.subcode, a.name, b.name subname from data a, subdata b where a.code = b.code;В этом примере
subname
— синоним поля subdata.name
, а a
и b
— синонимы таблиц data
и subdata
. Синонимы обладают всеми атрибутами замыканий: описываются по месту использования, не требуют присваивания им значения, и, что самое важное, не создают накладных расходов на выполнение запроса, что подтверждается планом СУБД.Использование синонимов оставляет у программиста ментальное ощущение легкости и удобства, которое неплохо бы перенести в другие языки.
Чистые функции
В языке Кантор любое выражение является чистой функцией. Функции можно дать имя, сопоставив ей идентификатор, имеющий тот же смысл, что и синоним в SQL:avogadro = 6.022e23; sodium = 22.89; mole[:Core:Real atomicWeight] = atomicWeight * avogadro; moleOfSodium = mole[sodium]; megabyte = 1K**; // 1024²В Паскале объявление аналогов функций
avogadro
, sodium
и megabyte
считалось бы объявлением констант при помощи константных выражений. В Канторе функции первичны, а константы являются частным случаем чистых функций. Чистота функций означает, что:- Сопоставление выражения функции делается один раз — при описании. Знак равенства тут нужно трактовать как символ синонима, а не как оператор присваивания.
- Использование функций не влечет дополнительных накладных расходов. В самом простом случае компилятор вставляет тело функции в место ее вызова.
avogadro
, sodium
и megabyte
считались бы константными таблицами, а mole
и moleOfSodium
— представлениями.Как принято в функциональных языках, тип результата функции может быть опущен, что задействует вывод типов компилятором. В нашем примере функция
megabyte
получит тип :Core:Int[32]
, а остальные функции — тип :Core:Real
. Функции, реализованные памятью
Кантор — функциональный язык системного программирования, что заставляет ввести в него понятие переменной непосредственно, не пряча за абстракциями-обертками. Чтобы не сломать первичность функций и не вносить исключений в правила, для переменных в Канторе принята оригинальная трактовка:Переменные являются функциями, реализованными памятью.Превратить функцию в переменную можно, «защелкнув» ее ключевым словом var:
var substance = moleOfSodium;Память позволяет сопоставлять значение функции много раз, что вполне ожидаемо дает побочный эффект. Сопоставление значений переменным является полноценным присваиванием, но записывается как и для чистых функций — знаком равенства:
substance = mole[15.99]; // oxygen substance = mole[55.85]; // ferrumТо есть, синтаксически и семантически присваивание является частным случаем сопоставления значения функции, и трактовка знака равенства как объявления синонима или присваиваения зависит от того, что стоит в левой части сопоставления — чистая функция или переменная.
В SQL аналогом переменных являются таблицы, а аналогом переменных с начальным значением — материализованные представления, состоящие из таблицы и связанного с ней представления одновременно.
Подписаться на:
Сообщения
(
Atom
)