SII писал(а):
1. Пакет Ады -- это не класс, это именно пакет (аналог дельфозного юнита, только с разделением заголовка пакета и тела пакета на физически разные исходные файлы). Аналогом класса является теговая запись (tagged record).
Кантор -- чистая ОО-система, в которой первичны именно классы и объекты, а всё остальное выражается через ООП, в том числе понятия модульного программирования. Для чистых ОО-систем ООП -- не модная фенечка, а способ переосмыслить предшествующие абстракции. Поэтому единицей трансляции в Канторе
является класс. Думал писать об этом в продолжение темы "Hello, world!". Сам "Hello, world!" из одной строчки -- тоже класс, пусть вырожденный и неявный.
SII писал(а):
3. Как по мне, принуждение везде использовать классы -- фанатизм и зло, хотя и не столь вселенское, как гугл. Не во всех задачах ООП удобно.
А вы подумайте и попробуйте понять, чем вызвано такое мнение. Предполагаю, что это обычный наведенный эффект от пользования гибридными языками, в которых ООП
неизбежно связано с накладными расходами. ОО-системы с
объектами первого класса существуют пока только в виде интерпретаторов и/или замкнутых миров, вроде Smalltalk/Squeak, так что Кантор, вероятней всего, будет первой такой системой на компилируемом языке.
SII писал(а):
4. Не понял насчёт переменной-особого вида функции. В Вашем примере как, можно присваивать этой переменной свободно? В адском примере применены процедуры как раз для того, чтобы нельзя было прямо изменить поля записи (мало ли что ещё дополнительно должно выполняться помимо простого присваивания).
Да, тут я налажал. Уже после отправки понял, но решил не исправлять, а дождаться отклика и признать свою ошибку.
Ведь если подумать, мой опыт разработки на Канторе пока минимален. Одно дело разрабатывать язык, а другое -- писать на этом языке. Прям системное и прикладное программирование в рамках одного проекта.
Немного поразмыслив, нашел два решения сокрытия переменной.
Во-первых, можно сделать как в Аде:
Код:
public class Accounts of
public final class Account of
public static out Account Create(Core:Money initialBalance);
public Deposit(Core:Money amount);
public Withdraw(Core:Money amount);
end;
end;
public final class Accounts:Account of
public var Core:Integer Balance;
var Core:Word accountNo;
end;
// вызов, анонимная функция
return Accounts:Account.Create(100);
Наличие оператора
new не запрещает создавать статические методы или функции, вызывающие его внутри себя. Такая фунция будет фабрикой класса, принимающей параметры позиционно, тогда как оператор
new берет их по именам.
Во-вторых, если путей инициализации много и не получается абстрагировать их в разумное число функций-фабрик, можно реализовать свойство только для записи, которое вызывать внутри
new. Фабрикой класса в этом случае становится сам
new (как предполагалось в прошлом, неудачном решении):
Код:
public class Accounts of
public final class Account of
public InitialBalance(Core:Money value);
public Deposit(Core:Money amount);
public Withdraw(Core:Money amount);
end;
end;
public final class Accounts:Account of
public var Core:Integer Balance;
var Core:Word accountNo;
end;
// вызов, анонимная функция
return new Accounts:Account of
InitialBalance(100);
end;
Большое спасибо за задачку, теперь у меня есть пример со свойством только для записи. Истинное удовольствие -- работать по внешней постановке!
SII писал(а):
5. Ещё раз как по мне: бесконечные public загромождают текст.
С этим вообще просто. Есть группировка с ключевым словом
of:
Код:
public class Accounts of
public final class Account public of // public поднимается сюда
InitialBalance(Core:Money value);
Deposit(Core:Money amount);
Withdraw(Core:Money amount);
end;
end;
Либо даже с
inner/
with inner of:
Код:
public class Accounts with inner of // распространяется на вложенные классы
final class Account public of
InitialBalance(Core:Money value);
Deposit(Core:Money amount);
Withdraw(Core:Money amount);
end;
end;
Не стал писать так в первом примере, чтобы код не был похож на ребус. В Канторе нет слова
procedure или
function, и
public играет их роль, особенно в примерах.