Ошибки PascalABC.NET

Нельзя их запрещать: функции без скобок разрешены синтаксисом языка Паскаль.

Мне кажется лучше всегда требовать inherited - лучше явно указывать что идет вызов конструктора именно базового класса. А при попытке вызова конструктора базового класса без inherited выводить что-то подобное этому:

Для вызова конструктора Create(какие-то параметры) класса T, являющегося базовым для T1, требуется inherited.

В Object Pascal конструкторы наследуются, поэтому inherited не используется когда нет неоднозначности

То есть это является хорошим тоном для Object Pascal - когда inherited не указывают? Вопрос у меня скорее эстетический.

inherited указывают когда хотят исключить поиск в текущем классе. Про эстетику я ничего не знаю.

Не уверен, что мой вопрос в эту тему, но все же спрошу здесь. Sort(a) и a.Sort меняют массив, Shuffle(a) и a.Shuffle меняют массив, Reverse(a) меняет массив. Почему тогда a.Reverse не меняет массив? Не логично как-то. Или это вопрос не логики? Опять же есть метод a.Sorted возвращающий отсортированную последовательность. Почему нет таких же методов a.Shuffled и a.Reversed?

2 лайка

Мне кажется, что это вопрос синтаксического сахара. Где-то подсластили, где-то - нет.

Да, тут всё не очень логично. Мы бы сделали a.Reverse меняющим массив. Но a.Reverse это стандартный метод расширения последовательности и он возвращает последовательность.

a.Sorted мне тоже не очень нравится. Я его вводил как синоним a.OrderBy(x->x) поскольку сортировка последовательностей - дело частое. a.Reverse - как я уже сказал - уже есть в .NET - и он делает то же, что Вы бы хотели чтобы делал a.Reversed. a.Shuffled - крайне редкая ситуация - перемешать последовательность. К тому же крайне неэффективная. Обычно перемешивают массив.

1 лайк

Хорошо, понял.

Планируется ли унифицировать данные вещи чтобы стало все более логично?

Почему при:

begin
  var A: PABCSystem.integer := 1;
end.

вылетает: Program1.pas(2) : Undefined name reference ‘integer’?

image

Снимок

Там всё верно. Закрыл Issue

Т.е. в паскале последовательности вида +++++, ------, ++ - + + - - - - +++ —, считаются составленными из унарных полюсов и минусов и не требуют скобок? Никогда об этом не задумывался. :grinning:

Почему Вы это считаете верным? Хотелось бы услышать Ваши аргументы.

И вот снова ошибка Undefined FileName, и снова её поиск был сущим адом, потому что каждый раз как я компилирую, чтоб проверить, не пропала ли ошибка - вылазит меседжбокс и файл перематывает на самый верх (из за того что переставляет курсор в самое начало). Я устал вас просит, но ещё больше я устал мириться с этим. Вы использовали доводы типа:

Как только основная ошибка будет устранена, будет устранена и эта.

(отсюда)

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

2 лайка

Да понятно, что все верно, это я “прошляпил” по аналогии с некоторыми другими языками, где запрещены подобные фокусы без скобок. Аргумент тут один и простой: разрешено синтаксисом языка Паскаль. Изначально.

Это ж везде есть. Вот, в C#: i=i+++ +- - -j; Про С++ я вообще молчу.

Отсюда обе ошибки устранены. И данный Issue тоже закрыт. Поэтому про неисчислимое количество - это одна. Эта.

Ошибки с Undefined FileName - увы - связаны с тем, что неаккуратный программист не ставил в соответствующем узле хотя бы какой-то Source context, хранящий имя файла и позицию.

Найти способ чтобы ошибки не возникали никогда - причем не только в компиляторах - наша давняя мечта тоже.