new для не именованных записей


#1

Как я написал там:

А вообще, я сейчас попробовал запустить…

Если указать правильное кол-во параметров конструктора - пишет:
Нет перегруженной подпрограммы с таким количеством параметров new

Если указать 1 параметр конструктора - пишет:
Неправильный тип параметров подпрограммы

То есть new вызывается, но в правильном варианте написания выдаёт явно неправильную ошибку.

То есть, сейчас эта возможность разрешена, но сломана. Давайте обговорим это сейчас.

Если запретить - надо заменить сообщение об ошибке. Если не запрещать - надо исправлять проблему из за которой не правильно пишет.

Но так как оно сейчас - оно работает в любом случае не правильно.


#2

Ну, заменить сообщение об ошибке.


#3

Но если оно уже почти работает, может всё же исправить?


#4

Поясните пожалуйста, что Вы имеете в виду. Написанный код неверен. Для неименованных записей бессмысленно вызывать конструктор - нет имени типа. Сделайте имя типу - всё заработает


#5

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


#6

И что?

Компилятор еще ничего не пытается сделать - он пытается понять код. Что значит часть кода уже работает? Если программа даже не компилируется, то ничего не работает!

И зачем Вы как-то пытаетесь улучшить код, который никогда не заработает? Конструктор этот невозможно вызвать, т.к. нет имени типа


#7

По крайней мере оно пытается найти конструктор. Поэтому я говорю что хоть что то есть.

Но ему ведь даёт какое то имя при компиляции? Вот я декомпилировал и у меня его назвало $record$1. И конструктор создало нормально.


#8

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

Вот упрощённый пример:

begin
  var x := new (10, 20); 
end.

Или Вы имеете в виду плохое сообщение об ошибке?


#9

А, это оно ошибку для процедуры для указателей выдаёт, вот как.


#10

А, ну да. Не перегружено, действительно. Тут сложно ещё, что new - ключевое слово только в некотором контексте. Как read и write например.

Вообще, наверное просто нужно запретить писать конструкторы в безымянных записях. По хорошему и методы тоже :slight_smile: Пишите Issue :slight_smile:


#11

А с методами что не так? Они то нормально работают, пусть живут.