Ошибки PascalABC.NET

В новой версии 3.3.5.1669 происходит ошибка компиляции шахмат game2.pas

game2.pas(61) : Несколько подпрограмм могут быть вызваны

Я ещё обратил внимание, когда смотрел что-то на GitHub, что прошёл коммит ABCPascal.y с изменением в const_variable, где была закомментирована часть с tkRoundOpen const_expr tkRoundClose. Может и не связано, но всё равно непонятно зачем.

Да, оно даёт конфликт в грамматике

Так и есть. Несколько подпрограмм могут быть вызваны

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.