Ошибки PascalABC.NET

    namespace Test
    {
        public class A<T>
        {
            public static int l;
        }

        class Program
        {
            static void Main(string[] args)
            {
                A<int>.l = 1;
            }
        }
    }

Например, компилируется, даже если T не используется.

Почему ошибка - это к разработчикам. Возможно компилятор не понимает, куда он должен производить инстанцирование этого Вашего integer.

Вы периодически забываете, что это Паскаль, а не С++ и не надо из него С++ сделать пытаться, как не надо пытаться добиться от него, чтобы всякая, простите, фигня, которая в С++ допустима, была допустима и тут. В данном случае это как если Вы по дорогу домой заодно подберете урну с мусором, которая Вам сто лет не снилась, и будете с нею в обнимку до дверей квартиры идти, а потом бросите.

Я уважаю разработчиков как людей, но хотелось бы чтобы компилятор изменился в лучшую сторону, а то получается, что даже верный код (синтаксически) не компилируется.

Да, кстати, в коде был C#.

А что, этот код нельзя в С++ набрать?

Я не спорю, что можно, просто я в Visual Studio 2017 проверял.

Кстати, это тоже не компилируется:

type
  a<t>=class 
    public class l: T; 
  end;

begin
  a&<integer>.l := 9; 
end.

Тогда указывайте, что это С#, а то получается, что пишете код, я на него ссылаюсь, а Вы начинаете рассказывать, что “язык не тот”.

Хорошо, учту на будущее.

Всё правильно он сделал, он оставил только то что нужно для вызова ошибки. T может использоваться для элементов класса, но они не нужны для вызова ошибки.

А ошибок компиляции даже в неадекватном коде не должно быть.

1 лайк

Вы задали вопрос, посему ошибка. Я Вам на него ответил, как смог и указал причину. Теперь Вы начинаете меня спрашивать, почему Ваш код не работает. Я Вам попытался сказать, что тестирование компилятора на каких-то заумных конструкциях, которые мне ни разу в жизни не понадобились (и не знаю, зачем могли бы понадобиться) мне не шибко интересно. У меня другие проблемы, более земные.

Обнаружил странную вещь и не пойму - это ошибка или особенность реализации?

begin
  var f:file of integer;
  Rewrite(f,'probe.bin');
  f.Seek(1000);
  f.Truncate;
  f.Close;
  Reset(f,'probe.bin');
  Writeln('FileSize=',f.FileSize);
  f.Close
end.

Известно, что Seek(n) перемещает указатель на запись с номером n (отсчет от 0). Нигде я не нашел указаний на то, что должно произойти, если установить указатель за пределы файла. В приведенном примере создается пустой файл. Далее указатель перемещается на позицию перед записью с номером 1000, т.е. смещается на 4х1000=4000 байт от начала файла. Того, у которого пока нулевая длина (!) и ноль записей. Truncate усекает остальные (!) байты, файл закрываем и… получаем файл длиной 4000 байт, заполненный высококачественными двоичными нулями.

Если открыть существующий файл по Reset и с помощью Seek отправить указатель “в туманные дали”, то и в этом случае Truncate позволит эти самые дали сделать родными.

С одной стороны, мне нравится такой способ создавать пустые файлы “левой задней ногой”. А с другой, иногда хочется, чтобы Seek(f,ДалекоДалеко) становился на Eof в соответствии с Filesize. Может, тут как со срезами, нужны два Seek - мягкий и суровый? Ну или один, но с опцией…

@Admin: GitHub пока решил не засорять этими размышлизмами.

@Admin, почему это не форматируется даже (а тем более не компилируется):

begin
  writeln(typeof(List<>)); 
end.

? В то время, как я ожидал, увидеть: System.Collections.Generic.List’1[T]. В C# работает и выводит что требуется:

    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(typeof(List<>));
            }
        }
    }

Да, это баг:

У нас не такая мощная система типов как в C#. Для нас это не тип

А что для Вас является типом?

Особенность реализации Если Вы сикаете, а потом пишете или усекаете, то файл расширяется

1 лайк

@Amdin, почему не компилируется при:

type
  T1<T> = record 
    X: T; 
  end;

var
  A: T1<string>;

begin
  with A do 
    X := 'str'; 
end.

? Ошибка: Program1.pas(11) : Нельзя преобразовать тип string к T.

Ведущий разработчик вообще считает, что использование with в PABC 3.x - анахронизм на грани фола. Об этом уже писалось.

Можно запретить использовать шаблоны с with но “нельзя преобразовать к T” это не правильно.

Да, не спорю - там - ошибка. With реализовывалась очень рано - для совместимости, потом когда появились женерики - не особо тестировалась с ними, потому что стоит только начать… Там по-существу надо вообще запрещать использование with с женериками