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

Так Вам же разработчик ответил - будет нечем больше заняться, может и сделают. Я-то спрашиваю чисто из желания понять - ЗАЧЕМ? И пока никак не могу увидеть этой надобности.

И хорошо. :slight_smile: Этот вопрос, считайте, закрыт.

procedure F() := exit;

begin
  var a := Rec(procedure() -> exit, procedure() -> exit); // (T1, T2)
  var b := Rec(F, F); // (T1, T2)
  Writeln($'a.GetType() = {a.GetType()}, b.GetType() = {b.GetType()}'); // a.GetType() = System.Tuple`2[Program5.$delegate14,Program5.$delegate15], b.GetType() = System.Tuple`2[Program5.$delegate16,Program5.$delegate17]
end.

На мой взгляд, не совсем корректно intellisence отображает типы a и b. Что, на Ваш взгляд, было бы правильно отображать на месте T1, T2?

Да, похоже это забыли реализовать как было с #983, сделайте новую issue в стиле enhancement.

Предлагаю ввести в язык внутриблочные константы такого вида:

Public Procedure My();
Begin
  Var a: Int32;
  Const Pi: Double = 3.1415;
End;

За(По сути, всё то же самое, что и во внутриблочных переменных):

  1. Нет необходимости замусоривать пространство между объявлением метода и его реализацией.
  2. Константы имеют локальное значение.

Против:

  1. Несостыковка со стандартным синтаксисом.
  • За
  • Против

0 голосов

1 лайк

Раз уж это взрослый форум, то почему бы утверждения не дополнять разумным обоснованием – “А почему именно так?”

Дополнил.

Непонятно, для чего в PascalABC.NЕТ делать внутриблочные константы. Опять из любви к искусству? Если программа сложная, она модульная и константы локализованы в модуле. Если страшно, что какая-то процедура или функция испортит параметр - объявите его параметром const.

В таком случае, внутриблочные переменные тоже не имеют смысла.

При таком подходе можно было просто сделать компилятор TurboPascal для .NET и не заморачиваться.

Как раз потому, что он .NET. Современный язык, не имеющий жёсткого деления программы на блоки. Описание констант в одном конкретном месте - ни что иное, как пережитки прошлого, которое язык не поворачивается назвать удачным.

Повторю ещё раз все преимущества и недостатки внутриблочных констант, на этот раз - с примерами кода.

Преимущества:

  1. Нет необходимости выносить константы в промежуток между объявлением метода и его реализацией(по - старому - блок описания констант):
//TurboPascal
Procedure MyVoid();
Const pi: single = 3.1415;
n: integer = 300;
k: real = 0.5;
Begin
  writeln(pi);
  writeln(n);
  writeln(k);
End;
//PascalABC.NET
Public Procedure MyVoid();
Begin
  Const pi: Single = 3.1415;
  Console.WriteLine(pi);
  Const n: Int32 = 300;
  Console.WriteLine(n);
  Const k: Double = 0.5;
  Console.WriteLine(k);
End;
  1. Локальное действие констант:
//TurboPascal
Const pi = 3.1415;
Const RPi = 3;
Begin
  writeln('Pi = ', pi);
  writeln('RPi = ', RPi);
End.
//PascalABC.NET
Begin
  Begin
    Const pi = 3.1415;
    Console.WriteLine(pi);
  End;
  Begin
    Const pi = 3;
    Console.WriteLine(pi);
  End;
End;

Недостатки: Новая конструкция, которой нет в старых версиях Паскаля.

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

Даже если меня среди ночи разбудить, я скажу, что в PascalABC.NET константа pi предопределена.

И что этот безумный код демонстрирует? Чем он лучше

var (n,k) := (300, 0.5);

И да, я назвал его “безумным”, потому что напоминает код сишного наркомана, бьющегося в “ломке” - все эти, абсолютно ненужные в Паскале пустые скобки, Console.Writeline, Int32, Double.

Так сделано в C++ и C#. Наверняка, не просто так. Констант тоже может быть много.

Приведите хотя бы один РАЗУМНЫЙ пример, где констант с одним именем много.

“Я шел по улице, там Вася и Петя стучали головами об стену. Наверно и мне нужно, ведь они наверняка не просто так.”

P.S. Когда уж вы все запомните, что “так сделано там-то” - не довод.?

А по моему важно то, что в ООП принято объявлять переменные как можно позже, прямо перед их использованием. И стараться делать так, чтоб они выходили из зоны видимости как только стали не нужны. И так же с переменными которые нельзя изменить, то есть константами. Это помогает программисту не думать о лишнем.

2 лайка

А зачем обязательно с одинаковыми именами?

А зачем тогда PatternMatching сделали? Он ведь из другого языка. Да и не только он. Сергей, в принципе, объяснил даже лучше меня.

Еще как довод. Тем более, если этим успешно пользуются в других языках (это в общем, а не конкретно к данному случаю).

@Gleb, я бы сделал так:

begin
  const x = 0;
end.

. Но, конечно, возможно указание явного типа константы будет полезно. Хотя, без этого как-то обходились раньше, не думаю, что будет предметом первой необходимости. Если хотите, создайте Issue, разработчики решат что с ней делать.

1 лайк

Константы объявляют в начале, чтобы потом не шарахаться везде в поисках. К примеру, объявили константу Vz в каком-то модуле - скорость звука. Через два месяца выяснилось, что взяли скорость звука в воздухе, а надо было в воде. И что, вспоминать в каком модуле использована? Вот поэтому константы выносят “наверх”, чтобы в глаза бросались. В разных модулях оправдывает разное наименование тогда, когда в каждом свое значение, но тогда это не константа а так, баловство и выпендрёж.

Сочли полезным - и сделали. А вовсе не потому, что оно “где-то есть, потому и нам надо”. Разницу улавливаете?

Пользуются потому что это просто есть или пользуются, потому что это реально что-то дает или потому, что иначе нельзя/неудобно в этом языке?

Можно и так.

Это важно для экономии памяти. Например, в Вашем примере тип x будет Int32 (4 байта), а если явно указать тип Byte - то один.

Пользуются потому что реально полезно. Я говорил в этом смысле. С той точки зрения, что константы будут ближе к месту использования - да, это, несомненно повысит качество кода. Но, все-же, повторюсь, не предмет первой необходимости.

1 лайк