Abstract Objects

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Как создаются объекты в вашем объектно-ориентированном языке? Давайте возьмем что-то классическое, например C++, Java или C#. Сначала вы определяете класс, а затем создаете его экземпляр. Первый шаг известен как абстракция, а второй - как инстанциация. В функциональном программировании существуют похожие операции: объявление функции является абстракцией, в то время как вызов ее с конкретными аргументами - применением. Вопрос в том, почему ООП нуждается в классах и объектах, тогда как ФП обходится только функциями?

Вот абстрактный объект на EO:

Название объекта - book. Он имеет три атрибута: id, db и title. Первые два атрибута являются “свободными”: они еще не привязаны к каким-либо объектам. Третий атрибут title уже привязан к копии объекта db.query. Объект book является абстрактным, потому что у него есть свободные атрибуты - он не является достаточно конкретным, чтобы относиться к конкретной сущности в реальном мире.

Конструкция db.query берет абстрактный объект query из объекта, привязанного к атрибуту db, и делает копию, указывая два аргумента: SQL-строку и id. Процесс копирования абстрактного объекта называется “применением”, поскольку он очень похож на применение аргументов к функции в ФП.

Правильным способом использования абстрактного book является создание его копии, указывая аргументы:

Здесь 42 является id, mysql является db, а b является новым объектом - копией book. В 𝜑-исчислении, которое является основой для языка программирования EO, это будет записано в виде следующей формулы:

Для получения title элемента b и называния его t, мы просто выполняем:

Мы также можем объединить все в одну строку:

Возможно применить некоторые аргументы к абстрактному объекту, оставив другие атрибуты свободными. Например, это создаст другой абстрактный объект, для которого все еще требуется указать id, чтобы он стал закрытым объектом.

Суффикс :db помогает компилятору понять, какой свободный атрибут должен быть привязан к объекту mysql. Позже, x может быть скопирован снова, и будет создан закрытый объект b.

Несмотря на то, что синтаксис EO позволяет использовать book.title, это приведет к ошибке компиляции: запрещено изменение свободных атрибутов абстрактного объекта или атрибутов, зависящих от других свободных атрибутов. Однако, предположим, мы добавляем новый атрибут print к book, чтобы вывести его id в консоль, мы сделаем следующее:

Атрибут print не требует привязки атрибута db, так как он не использует его. Можно скопировать book только с id и затем вызвать print (предполагается, что это происходит в интерактивной консоли EO).

Кстати, ты знаешь другие языки с абстрактными объектами или Эсперанто впервые представило такой дизайн?

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 14:24

sixnines availability badge   GitHub stars