Ошибки PascalABC.NET

нет, нельзя

  1. Выражения +,* и т.д. нельзя использовать как операторы

  2. Точка имеет приоритет, надо ставить скобки

3.>" Program1.pas(2) : Неизвестное имя ‘Print’ " (2**7) возвращает real, у него нет функции Step без параметров. Соответственно вызывается просто делегат step, которого нет метода Print

Кроме третьего - понятно(знать бы что такое делегат…), но когда компилятор выдаёт " () : Встречено ’ " - это странно.

Нет, так НЕ ДОЛЖНО работать! Расширение .Step определено для целочисленных типов.

begin
   Trunc(2**7).Step.Take(50).Println
end.

2**7 - это Power(2,7):real

а что странного? операция степени недопустима в данном контексте, вот и предлагает двоеточие после цифиры (метки), а точку с запятой после буквы.

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

Да, запустил. Выдает: Синтаксическая ошибка : Встречено ‘**’, а ожидалось ‘:’

Сборка 1607, Вин10 x32, “.NET Framework 4.6 или более позднее обновление уже установлены на этом компьютере.”

У кого-нибудь еще звездочки съедаются в сообщении об ошибке? Мы вроде маркдаун в гридах не делали…

Windows XP Professional SP3 (лицензионная)

Win 7, сборка 1607

Что это?

Ошибка при работе с обобщенными типами:

Прошу исправить данную ошибку. В C#, например можно писать так: list.Add(new ListNode(i));

Это ваша ошибка, компилятор вам так и сказал, это нельзя передать как var-параметр, присвойте сначала переменной. А List.Add будет работать как в C#.

Type
  A = auto class
    E := '0123456789';
    F: array[char] of integer;
    
    Constructor ();
    Begin
    End;
    
    Procedure B (А, Б: StringBuilder);
    Begin
    End;

  End;
Begin
  var C := '123';
  var D := '4567';
  (new A()).B(C,D);
End.

Код забавнейший получился… Если поставить точку после C или D на предпоследней строке, то там не отобразатся многие методы-расширения (print, println, inverse…). Причём если (new A()).B(C.print,D); - выдаст ошибку, то (new A()).B(C.inverse,D); скомпилируется и правильно выполнится. Кстати, непонятно, почему "Нельзя преобразовать тип IEnumerable к System.Text.StringBuilder", если это переменная типа string; То есть, метода inverse у StringBuilder нет, но он компилируется, и print’а тоже нет, но он уже не компилируется…

Эти методы вообще нигде не видно. Но, если убрать E или F, то волшебным образом всё встаёт на свои места… А если убрать конструктор, получим ошибку компиляции, которая в ином случае вовсе и не ошибка… А кто во всём виноват? - правильно! Автокласс! Стоит его убрать, и все эти ошибки пропадают.

А причем тут методы StringBuilder’а? Фактические параметры C и D имеют тип string, у которого есть методы inverse и print. С методом print, похоже, в этом случае действительно непорядок, inverse же работает так, как и должен.

Да, для автокласса intellisense их не подсказывает – недоработка.

Мне больше всего непонятно, почему результат метода 'string'.Print не совместим по присваиванию со string (без явного вызова ToString):

begin
  var S := 'abc';
  println(S.Println.GetType); // Как бы 'System.String'
  //S := S.Println; // Но так не работает, хотя метод возвращает совместимый 'sequence of T'
  S := S.Println.ToString; // Так OK
  // Что это за тип такой мудреный?
  println((S.Println + '123').GetType); // System.Linq.Enumerable+<ConcatIterator>d__59`1[System.Char]
end.

Оформляйте 2 багрепорта на гитхабе.

@admin Было бы неплохо добавить стандартные методы Print/Println для Char.

В смысле ‘c’.Print?

Да.

А почему тогда не замахнуться на любые типы?