Замечания и предложения

IDE зависала, после закрытия следующего окна при проверке обновлений:

, если следующее за первым модальное окно не появлялось мгновенно и я успевал нажать в окно самой IDE. Версия: 3.5.2238.

const
  n = int64(cardinal.MaxValue)+5;

begin
  var s: string[n];
end.

Может стоит выдавать ошибку в данном случае?

Здравствуйте! Почему, когда я установил последнюю версию 3.5, то когда я пытаюсь нажать кокую-нибудь клавишу, то выходит такая ошибка

Скорее всего у вас старая версия .Net . Установите эту версию паскаля:
http://pascalabc.net/downloads/PascalABCNETWithDotNetSetup.exe
В ней упакован сразу и установщик .Net 4.7.1. (а System.Array.Empty добавили в .Net 4.6)

А какая у вас версия Windows?

7

Тогда следуйте совету @Sun_Serega

А .Net автоматически устанавливается или же всё таки должен открываться мастер установки?

Установщик паскаля вы всё так же должны открывать. А установщик .Net откроется сам. Возможно - в тихом режиме (не открывая окно установщика .Net), если установщик паскаля такое умеет (сам уже давно не обновлял .Net, иба её версия, в отличии от самого паскаля - обновляется крайне редко, так что хз умеет ли).

Что такое packed-массивы в PascalABC.NET?

begin
  var a: packed array of integer;
end.

В справке об этом ничего не сказано, но этот код компилируется…

Хотя, судя по IL, они вообще ничем не отличаются от обычных массивов. Это какая-то недоделанная фича?

Это для совместимости. packed ничего не делает

2 лайка

Полагаю, хорошо было бы иметь возможность писать:

function Numerate<T>(self: sequence of T): sequence of class(index: integer; item: T);
begin
 // implementation here
end;

вместо:

type
  Some<T> = sealed auto class
    index: integer;
    item: T;
  end;

function Numerate<T>(self: sequence of T): sequence of Some<T>;
begin
 // implementation here
end;
  1. Когда могло бы пригодится: при желании писать методы расширения, подобные Numerate, которые возвращают кортеж.
  2. Почему это могло бы пригодится: кортеж имеет стандартные имена элементов, не отражающих суть их использования в конкретной задаче.
  3. Что взамен получит пользователь: краткую запись кода и возможность не писать маленькие классы.
  4. Возможные проблемы: решение того, как будут такие типы отображаться в Intellisence. Вариант: class, либо class(index, item) (на примере вышеописанного класса). Лично я придерживаюсь последнего.

Варианты реализации:

  • на автоклассах (примеры выше)
  • на кортежах (именованные кортежи)

Сомнительная сделка… Время разработчиков (часы, сутки) на разработку <—> время написания кода у рядового пользователя в редких случаях (секунды).

Полагаю, что рядовому пользователю не нужны и методы расширения и многие другие вещи.

Я лишь указал на появившуюся у меня идею улучшения (с моей точки зрения) языка. Дальше - дело разработчиков. При любом их решении потерь особых не будет для языка поскольку это не фича первого плана.

Возможно, обдумывая то или иное предложение по расширению языка будет полезно вспоминать, что на настоящий момент он и так уже достаточно велик. Причем настолько, что попытка более-менее полно описать его у меня, к примеру, заняла больше года. И все чаще посещает мысль, что Оккам был прав, предлагая не множить сущностей сверх необходимого.

2 лайка
  1. Это не новая фича, это дополнение старой.
  2. Я сам ни раз сталкивался с такой необходимостью. К примеру, когда надо сделать Stack содержащий объекты с типом анонимного класса:
begin
  var st := new Stack<class(x: integer; s: string)>;
  
  foreach var v in ... do
    // какая то работа со стеком
  
end.

Без возможности описать тип анонимного класса без создания экземпляра - получается самый красивый способ такой:

function NewSt<T>(a: T) := new Stack<T>;

begin
  var st := NewSt(new class(x := 0,s := ''));
  
  foreach var v in ... do
    // какая то работа со стеком
  
end.

Но это довольно некрасивый костыль. И весь смысл анонимных классов - в том чтоб не добавлять лишние имена. А тут всё равно пришлось добавить имя функции.

1 лайк

И еще. Жил в V в. до нашей, естественно, эры в Афинах некий Горгий Леонтинский. Был известен он своими речами и однажды написал трактат, озаглавив его “О несуществующем или о Природе”. В нем он доказывал, что:

  • ничто в природе не существует;
  • а если существует, то непознаваемо;
  • а если и познаваемо, то непередаваемо

Вот я и думаю: может сей достойнейший муж, имея в виду второе и третье высказывание, уже тогда сумел предвидеть создание бесконечно расширяемых языков программирования?

3 лайка

В уме компилировал. Исправил.

Должен заметить, что при возникновении проблем в автовыводе типов в более сложной ситуации (например, при использовании Linq) это не будет работать.

Автовывод сломан только у анализатора кода, в достаточном маштабе. У компилятора осталось только несколько мелких и редких багов автовывода.