Содержание

Открытие языка программирования

Документирование

Документирование не должно ограничиваться голыми блоками комментариев. Это поняли, например, создатели и многочисленные пользователи утилиты Doxygen. Фактически подготовка документации представляет собой тот же самый синтаксический разбор с генерацией текста по результатам. Это возможно сделать средствами самого языка.

Комментарии и описания не обязательно должны быть особыми встроенными в ядро языка синтаксическими конструкциями, как это сделано в подавляющем числе языков. Они вполне могут быть сделаны через общие средства, которыми также можно анализировать и обрабатывать их.

Объектная парадигма

Пусть А — объект, S — селектор сообщения. Диспетчеризация представляет собой операцию M = A S, где M — метод, т. е. исполнимый объект, выполняемый при посылке сообщения объекту.

Посылка сообщения в виде A S X = (A S) X, где X — параметры, обеспечивает разделение операций диспетчеризации и собственно обработки параметров сообщения.

Именованные аргументы

Smalltalk предоставляет хороший способ именования методов: части имени рассеиваются между аргументами как бы именуя их.

 cond IfTrue: x IfFalse: y
 

Где IfTrue:IfFalse: — название метода.

Логика синтаксического разбора достаточно проста: в один идентификатор собираются куски, завершающиеся двоеточием до появления ограничивающего токена.

Множественное представление

Набор данных может иметь несколько различных представлений. Так, например, машинное слово может быть как целым числом, так и последовательностью разрядов (битов). Как правило работа с различными представлениями идёт через разные интерфейсы. Но иногда бывает удобно использовать один интерфейс. Для этого ссылка на объект должна в себе содержать как адрес данных, так и идентификатор интерфейса.

5 -> a
a + 9              # 14
a bits + 9 bits    # 1, 0, 1, 0

Направление присвоения

Традиционно языки используют операцию присвоения «справа налево» (a ← b), то есть значение правого аргумента присваивается левому. С точки зрения логики вычислений более подходило бы присвоение «слева направо» (b → a).

Генерализация

Часто можно обнаружить, что у разнородных объектов существуют операции, которые вне отношения к роду объектов обладают сходными свойствами.

Обобщённые типы операций, которые можно применить на множестве типов:

Обобщённые арифметические операции

Для многих объектов можно найти набор операций, аналогичных четырём арифметическим.

Умножение

Пусть существует бинарная операция, которая обладает следующими свойствами:

и возможно следующими:

Такую операцию назовём умножением.

Сложение

Пусть существует операция, обладающая следующими свойствами:

а также возможно следующими:

Такую операцию назовём сложением.

Деление

Пусть существует операция, обратная умножению, то есть:

tex:a * b = c \to c / b = a,

где равенство возможно выполняется с некоторой погрешностью представления. Такую операцию назовём делением.

Возможно таких операций две (для девого и правого операнда умножения):

tex:a * b = c \to c / b = a (левое деление),
tex:a * b = c \to c \backslash a = b (правое деление).

Вычитание

Пусть существует операция, обратная делению, то есть:

tex:a + b = c \to a - b = a,

Назовём такую операцию вычитанием.

Операции с порядком

Свойство упорядоченности — наличие у объекта четырёх взаимоисключающих отношений:

Определение порядка

Определение порядка определяется следующими операциями:

Операции <>= и ~<>= фактически определяют наличие упорядоченности элементов

Если порядок полный (соотношение «не определено» не реализуется), то для операций выполняются следющие соотношения:

Минимум и максимум

Максимумом назовём такой элемент, который больше или равен двум другим и не существует элемента меньшего таковому с указанными свойствами. Если такой элемент существует и единственен, то операцию, возвращающую его назовём max.

Аналогично с минимумом.

Лямбда-исчисление и традиционное процедурное программирование

Нет ничего зазорного в том, чтобы традиционные функции определять через лямбда-операции, т. е. вместо

идентификатор тело

писать

тело → идентификатор

(где → — операция присвоения)