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


#1638

Как насчёт разрешить константы - записи.
Было бы очень полезно для 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.

#1639

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


#1640

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

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->инициализация записей


#1641

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


#1642

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

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


#1643

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


#1644

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 просто забыли?


#1645

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


#1646

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

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


#1647

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


#1648

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


#1649

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


#1650

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


#1651

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


#1652

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


#1654

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


#1655

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

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


#1656

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

begin
  Round(2.3456,2).Print
end.

#1657

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


#1658

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