Замечания и предложения

Как насчёт разрешить константы - записи.
Было бы очень полезно для match, который уже разрешает их, но не разрешает не_константы:

type
  t1 = record
    val: integer;
    
    const c1: t1 = (val: 5);
    
  end;
  
begin
  var a: t1;
  a.val := 5;
  match a with
    t1.c1: Writeln(true);
  end;
end.

Такая запись противоречит синтаксису языка. Нет?

Такая запись уже закреплена в языке:

type
  t1 = record
    val: integer;
    
    // работает
    static c1: t1 = (val: 5);
    
  end;
  
begin
  var a: t1;
  a.val := 5;
  match a with
    // зато теперь тут не принимает
    t1.c1: Writeln(true);
  end;
end.

F1->поиск->record->инициализация записей

Что ж. Печально, коль скоро это так. Я бы понял val := 5, но val: 5 - это для Паскаля описание переменной val c некорректным именем типа 5. Я смотрю на конструкцию описания типа static c1: t1 = (val: 5); - она интуитивно совершенно непонятна и высосана из пальца. Как вот выяснилось - из Дельфи.

1 лайк

Ну, с этим я согласен. Синтаксис анонимных классов на много лучше. Но я так понимаю, в старых паскалях записи инициализируются именно так.

Вообще в идеале бы разрешить и : и :=, чтоб и совместимость, и читабельность были.

var p: Person := new Person(‘Иванов’,20); - это нормально. А дельфийское var p: Person := (Name: ‘Иванов’; Age: 20); - это гадость.

ReadString и Read(var s: string) работают не одинаково:

begin
  Console.SetIn(new System.IO.StringReader(
    'abc'#10
    'def'#10
  ));
  loop 2 do ReadString.Length.Println;
end.
begin
  Console.SetIn(new System.IO.StringReader(
    'abc'#10
    'def'#10
  ));
  loop 2 do
  begin
    var s: string;
    Read(s);
    s.Length.Println;
  end;
end.

ReadString вызывает ReadlnString, то есть после чтения строки - знак конца строки всегда убирается из потока ввода.

А Read(var s: string) читает только ДО знака конца строки, поэтому второй вызов подряд всегда вернёт пустую строку.

Это так и задумано или про старые Read просто забыли?

Это так задумано. Старый Read он для совместимости. Но если вы хотите считать строку с помощью x := ReadString, вряд ли кому-то придёт в голову считывать строку без перевода на новую строку

1 лайк

Старые как раз были Read, читающие до терминирующего символа, и Readln, сбрасывающие из буфера предчтения символы смены строки.

Во многия знания - многия печали.

Я именно их старыми и назвал.

В .Net есть аналог ReadLine - он пропускает перевод строки. ReadString это его полный аналог. А ReadlnString - это если кому- то придёт в голову написать в конце ln ))

Ну Вас же не смущает, что у ReadArrString нет варианта ReadlnArrString ? Так и здесь, ReadString вместо ReadlnString введет единообразие для строк и сократит запись.

Может его тоже сделать obsolete и через время - “того” ? Что плохого прийти в 3.6 с более чистыми ногами?

Просто ReadlnInteger отличается от ReadInteger

Но речь о строках

Как мне поступить, если я хочу позволить пользователю задать значение переменной, регулирующей количество знаков после запятой (здесь (System.Math.Round(x, digits, System.MidpointRounding.AwayFromZero)) — digits). Но, как вы знаете, значение > 15 выдаст ошибку. Т. е. я нашёл только, как обрезать значение переменной в write (x:0:5), но подойдёт ли этот способ при вычислениях внутри программы (без write)?

Вычисления процессор всегда проводит с максимально возможной для него точностью. Для типа real/double погрешность расчетов зависит исключительно от алгоритма. Ограничить точность указанным числом знаков (разрядностью) можно только программно, но ни один распространенный язык программирования этим “не страдает”, поскольку такие действия могут только существенно замедлить вычисления.

P.S. Я вот написал, а думать продолжаю: когда такое в принципе может понадобиться? И ответа не нахожу.

Вот округление до 2 знаков после точки

begin
  Round(2.3456,2).Print
end.

Так это одноразовое округление. Если нужно именно оно, то вопрос был задан некорректно. Я его понял, как желание зафиксировать разрядность в дробной части при выполнении операций. Такое я видел только в системах, где разрядность произвольная и на плавающей точке, например, в пакетах компьютерной математики типа Maple,

В чём отличие между System.Math.Round и x:0:5? Куда можно задавать подобные вопросы (не хочу засорять тему “Замечания и предложения”)? Нашёл баг сайта: в Google Chrome идёт пересечение горячих клавиш, поэтому при нажатии Ctrl + Shift + C вместо открытия инструментов разработчика вставляется шаблон неотформатированного текста (Текст "как есть" (без применения форматирования)).

1 лайк