Так Вам же разработчик ответил - будет нечем больше заняться, может и сделают. Я-то спрашиваю чисто из желания понять - ЗАЧЕМ? И пока никак не могу увидеть этой надобности.
И хорошо. Этот вопрос, считайте, закрыт.
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?
Предлагаю ввести в язык внутриблочные константы такого вида:
Public Procedure My();
Begin
Var a: Int32;
Const Pi: Double = 3.1415;
End;
За(По сути, всё то же самое, что и во внутриблочных переменных):
- Нет необходимости замусоривать пространство между объявлением метода и его реализацией.
- Константы имеют локальное значение.
Против:
- Несостыковка со стандартным синтаксисом.
- За
- Против
0 голосов
Раз уж это взрослый форум, то почему бы утверждения не дополнять разумным обоснованием – “А почему именно так?”
Дополнил.
Непонятно, для чего в PascalABC.NЕТ делать внутриблочные константы. Опять из любви к искусству? Если программа сложная, она модульная и константы локализованы в модуле. Если страшно, что какая-то процедура или функция испортит параметр - объявите его параметром const.
В таком случае, внутриблочные переменные тоже не имеют смысла.
При таком подходе можно было просто сделать компилятор TurboPascal для .NET и не заморачиваться.
Как раз потому, что он .NET. Современный язык, не имеющий жёсткого деления программы на блоки. Описание констант в одном конкретном месте - ни что иное, как пережитки прошлого, которое язык не поворачивается назвать удачным.
Повторю ещё раз все преимущества и недостатки внутриблочных констант, на этот раз - с примерами кода.
Преимущества:
- Нет необходимости выносить константы в промежуток между объявлением метода и его реализацией(по - старому - блок описания констант):
//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;
- Локальное действие констант:
//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. Когда уж вы все запомните, что “так сделано там-то” - не довод.?
А по моему важно то, что в ООП принято объявлять переменные как можно позже, прямо перед их использованием. И стараться делать так, чтоб они выходили из зоны видимости как только стали не нужны. И так же с переменными которые нельзя изменить, то есть константами. Это помогает программисту не думать о лишнем.
А зачем обязательно с одинаковыми именами?
А зачем тогда PatternMatching сделали? Он ведь из другого языка. Да и не только он. Сергей, в принципе, объяснил даже лучше меня.
Еще как довод. Тем более, если этим успешно пользуются в других языках (это в общем, а не конкретно к данному случаю).
@Gleb, я бы сделал так:
begin
const x = 0;
end.
. Но, конечно, возможно указание явного типа константы будет полезно. Хотя, без этого как-то обходились раньше, не думаю, что будет предметом первой необходимости. Если хотите, создайте Issue, разработчики решат что с ней делать.
Константы объявляют в начале, чтобы потом не шарахаться везде в поисках. К примеру, объявили константу Vz в каком-то модуле - скорость звука. Через два месяца выяснилось, что взяли скорость звука в воздухе, а надо было в воде. И что, вспоминать в каком модуле использована? Вот поэтому константы выносят “наверх”, чтобы в глаза бросались. В разных модулях оправдывает разное наименование тогда, когда в каждом свое значение, но тогда это не константа а так, баловство и выпендрёж.
Сочли полезным - и сделали. А вовсе не потому, что оно “где-то есть, потому и нам надо”. Разницу улавливаете?
Пользуются потому что это просто есть или пользуются, потому что это реально что-то дает или потому, что иначе нельзя/неудобно в этом языке?
Можно и так.
Это важно для экономии памяти. Например, в Вашем примере тип x будет Int32 (4 байта), а если явно указать тип Byte - то один.
Пользуются потому что реально полезно. Я говорил в этом смысле. С той точки зрения, что константы будут ближе к месту использования - да, это, несомненно повысит качество кода. Но, все-же, повторюсь, не предмет первой необходимости.