Аналог Records из C#


#1

Пусть имеем такой код:

uses System;
uses System.Collections.Generic;

type
  TPerson = auto record class
    Name: string;
    Age: integer;
  end;

begin
end.

auto record класс TPerson развернётся в:

uses System;
uses System.Collections.Generic;

type
  TPerson = class(ICloneable, IEquatable<TPerson>)
  public
    auto property Name: string;
    auto property Age: integer;
    
    constructor(name: string; age: integer);
    begin
      self.Name := name;
      self.Age := age;
    end;
    
    function Clone(): object := new TPerson(Name, Age);
    
    function Equals(other: TPerson) := (Name = other.Name) and (Age = other.Age);
  end;
  
begin
end.

Что это даёт:

  1. Автоматическая генерация автосвойств с указанными именами.
  2. Автоматическая реализация интерфейсов ICloneable и IEquatable<T>.

Автоклассы ничего из этого не дают. Можно также запретить описывать что-либо кроме полей, связанных с автосвойствами в таких классах. Что-то подобное планируют (Records) сделать и в C#.

@Admin, Вы сказали в Issue:

Есть несколько технических проблем и неувязок дизайна языка.

Можно поподробнее?


#2

Я уже сейчас не помню. Пусть повисит - буду вспоминать.

Надо посмотреть, во что разворачивается код Record classes в новом C#. И взять оттуда полезное для наших автоклассов и автозаписей.

Мне не нравится вообще инициализировать записи вызовом конструктора - это неестественно поскольку память при этом не выделяется. Если я когда-то буду писать желаемые правила организации кода на PascalABC.NET, я обязательно это отмечу. Кроме того, такой вызов неэффективен: функция, возвращающая запись на стеке, жрёт память и время работы.

Рассматривался вариант метода Init т.к.запись уже создана в памяти, но как-то не сложилось.


Только сейчас обратил внимание, что мы говорим о разном. Вы говорите про аналог Record Classes в C#.

Ну, это совершенно новая конструкция. Её синтаксис пока никак не лёг. Ваш - неудачный. Record classes надо делать с таким синтаксисом чтобы ничем нельзя было их дополнить.

С другой стороны, нетрудно расширить автоклассы до указываемого вами поведения.


#3

Можно и так, но главное чтобы возможность пользоваться ими как можно сейчас не утратилась.


#4

Вы можете привести пример синтаксиса?


#5

Ну найдите C# Record classes


#6

В статье, ссылку на которую я Вам давал в Issue такой синтаксис:

public class Sword(int Damage, int Durability);

Можно тогда так для Паскаля:

type
    class Sword(Damage, Durability: integer);

#7

В Паскале синтаксис класса такой:

type Имя = class(предок, интерфейсы)

end;

От этого надо как-то плясать.


#9
type
    Sword = recordclass(Damage, Durability: integer);

Можно так, например. @Admin, как Вам? Точнее, чтобы автосвойства объявлялись с тем же примерно синтаксисом, что и параметры подпрограмм и методов. Можно сделать, чтобы эта запись разворачивалась в автокласс, реализующий ICloneable и IEquatable<T>. То есть, если хватает этой однострочной записи - используем, если надо больше функционала - автоклассы.


#10

recordclass - это что-то ужасное. Вообще, новые ключевые слова - это плохо. И - сильно перекликается с автоклассами.


#11

Кстати, если уж на то пошло -

type
    Sword = auto class(Damage, Durability: integer);

#12

Отлично! Мне Ваш вариант больше нравится.