Ошибки PascalABC.NET

4 сообщения перенесены в тему Болталка PascalABC.NET

function f1:byte;
begin
  var p:procedure;
  p := procedure->writeln(Result);
end;

begin end.

В данной версии компилятора не поддерживается замыкание данного типа символов

Тут ошибка в не правильном сообщении об ошибке или в том что эта фича не реализована? Стоит ли вообще разрешать использовать Result более высокого уровня если последняя лямбда - процедура?

1 лайк

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

begin
  Writeln($'test');
end.

Это ошибка? И если да, то в том что форматную строку без параметров не даёт делать, или в том что анализатор кода ломается?

В справке не сказано о количестве аргументов в кортежном присвоении… Т.к. „большие“ кортежи очень редки, то данная тонкость забывается!

begin
  var(a,b,c,d,e,f,g,h):=(1,2,3,4,5,6,7,8);
end.

Такой код выдаст ошибку ;–(

Пишите какую ошибку выдаёт после кода, пожалуйста.

Возможно кортежи и не должны быть больше 7 элементов, но Undefined FileName это всегда ошибка которую надо исправить.

Исправили все ошибки с неверными сообщениями в туплах

1 лайк

В Справке по методу cast приведен такой пример:

begin
  var a: sequence of integer; 
  var b: sequence of real;
  a:=Seq(1,3,5);
  b:=a.Cast&<real>;
end.

Естественно ожидать, что как и описано, мы получим последовательность элементов типа real. Но она какая-то “неправильная”. Во-первых, её не понимает ни Writeln(b), ни b.Println. Во вторых, к ней нельзя применить ни одно расширение типа .Min, First, Sum и т.п. Да и тип у этого b, если отладчиком стать на end и посмотреть в “локальных переменных” - System.Linq.Enumerable+d__95`1[System.Double] - ну очень мало похож на описанный парой строк выше.

Не спешу открывать issue, может, просто что-то я не так понял?

В описании .NET нашёл, что tuple могут иметь произвольное количество элементов, но если их больше семи, то они представляются как цепочка, связанная через TRest.

У нас нет. Для этого пользуйтесь типом Tuple<>. И сами стройте такие цепочки

Надо убрать этот Cast из справки. Пример неправильный.

Issue явно не для целей замечаний по справке. А то видите - у нас наметились тенденции пихать в Issue всё что приходит на ум. Вместо того чтобы завести топик на форуме и обсуждать там всё что интересно.

Но то что оно с writeln не работает, выдавая, при том, неадекватную ошибку всё же надо в issue.

Ну там же запрос ленивый - он неправильный и он срабатывает при writeln

А, вот как, когда value-тип обёрнут в объект у него не работает operator explicit? В таком случае Select использовать или что? Но ведь в Cast посылается только тип, и на этапе компиляции, а в Select целая функция, которая потом ещё по указателю вызывается… Это точно невозможно реализовать, к примеру проверкой при компиляции, если T это value-то вызывать по другому преобразование?

Я ничего не понял, что Вы написали в последнем топике. Если можно - примеры

begin
  var i:integer := 5;
  var o:object := i;
  var r:real := real(o);
end.

После преобразования integer к object - его уже нельзя преобразовать к real. То есть ищет типы к которым можно преобразовать среди наследников, но игнорирует integer.operator implicit, которым integer можно преобразовать к real.

А, понял. Нет, operator explicit я думаю не работает. Вообще, это какое-то тёмное дело преобразовывать упакованные размерные типы с помощью переопределённого оператора. Я бы не стал это делать ни на каком языке.

Код, который Вы привели, - ошибочный. Это не приведение типов - это распаковка, причем, в неверный тип. И, я думаю, распаковку переопределить нельзя. Это такая базовая для NET операция. Ну собственно Вы это и видите.

1 лайк

А можно правильный пример? Я вообще не пойму, как его использовать.

Надо использовать на наследниках:

type
  t1=class end;
  t2=class(t1) end;

begin
  var a1 := new t1[1](new t1);
  var a2 := a1.Cast&<t2>;
  var a3 := a2.Cast&<t1>;
end.
1 лайк

Не могу, в последней версии уже нет доступа к TRest. Например, (1,2,3,4,5,6,7,(8,9)) теперь вызывает ошибку. Раньше тоже некая путаница была, так как такая запись была “хаком” для ввода (1,2,3,4,5,6,7,8,9) И вроде, запятую нельзя перегрузить, чтобы переложить на компьютер заботу о таких тонкостях.

type
  e1=(
    es1 = 1,
    es2 = 2
  );

begin end.

Форматируется в:

type
  e1 = (es1= 1,
  es2= 2
  );

begin end.

То есть es1 никак не даёт описать на следующей строчке. А ещё оно убрало пробелы между es1 и =, и так же с es2.

Что из этого годится для issue и сколько отдельных делать?