С чем связано то, что нельзя писать скобочки для единственного параметра лямбда-выражения? В C# такое разрешено. Есть какое-либо логическое обоснование такого решения разработчиков?
С одной стороны - это вызывает неоднородность синтаксиса:
begin
var x1: Func<byte, byte> := x -> 0; // Скобки запрещены.
var x2: Func2<byte, byte, byte> := (x, y) -> 0; // Скобки разрешены.
end.
, c другой - этой проблемы можно избежать, используя function/procedure:
begin
var x1: Func<byte, byte> := function(x) -> 0;
var x2: Func2<byte, byte, byte> := function(x, y) -> 0;
end.
Это не попытка, а стандартный синтаксис языка. Попытка - это предложение запретить не писать скобки у функций без параметров. Тут уже что только не предлагали в раже, вплоть до разрешения вместо begin … end писать { … }
Единственным аргументом за их сохранение я вижу совместимость с стандартом Pascal. Контраргумент - куча проблем. Отдельная тема, поэтому не буду расписывать.
А никто и не говорит об их сиюминутном запрете. Сначала - предупреждение, как с for без объявления параметра в заголовке. Не вижу катастрофы в этом. PascalABC.NET уже и так нарушил почти все каноны стандартных Паскалей, уступив в этом, пожалуй, только Oxygene. Я бы даже сказал так: от Паскаля в PascalABC.NET остался лишь набор ключевых слов и базовый синтаксис.
А у лямбд скобки никто и не отнимает. () -> () считается нормальной записью, нельзя же писать
var F ->
Проблемы есть и они решаются. До сих пор решались - никто не умер.
Да ничего практически он не нарушил! Если бы действительно нарушил - от него бы мгновенно массово отказались все школы и прочие учебные заведения. Все без исключения учебники описывают синтаксис максимум уровня Free Pascal, учителя и преподаватели не знают и знать не хотят никаких С-подобных Паскалей. Переделывать в таких условиях синтаксис в угоду кучке адептов языка С было бы огромным просчетом.
Мне бы хотелось услышать что-нибудь кроме “никто не умер”, и, наверное, другим тоже, поскольку от любого нововведения можно пытаться отказаться, аргументируя тем, что раньше его не было и
.
Вы уверены? В каком стандарте Pascal есть срезы, кортежи, лямбда-выражения, сокращенные записи методов/подпрограмм, делегаты, автоклассы, классы типов и т.д.? То, что учебники не описывают множество функционала языка, содержащего элементы современного программирования (например, лямбды), не повод говорить, что он ничего не нарушил. В PascalABC.Netможно писать в формате стандартного Pascal. И никаких противоречий здесь не наблюдается.
На счёт отказались - не думаю, что это кому-то это надо, так как это легковесная среда, в которой просто проводить обучение. А главное - удобно, так как нет загруженности интерфейса как в профессиональных IDE. Можно, конечно, было бы обучать в Free Pascal, но учащихся отпугивает старомодный интерфейс, который по сравнению с современными интерфейсами не совсем удобен.
А я вам говорю, что то что вы предлагаете, и те фичи которые были добавлены - это не одно и тоже. Добавленные фичи не нарушают старый синтаксис, поэтому ваш пример неправильный.
Вы бы сходили на куберфорум - увидели бы как много людей пишут в PABC.Net в стиле турбо паскаля. Т.к. сейчас есть совместимость - у них есть шанс переучится на более благоразумный стиль. А если в паскале поменяется что то на сколько фундаментальное - учителям будет проще использовать турбопаскаль, ибо большинство из них не понимает удобств IDE. А вот в турбопаскале не получится на нормальный стиль переучится, даже если захотеть.
Но вы всё же отошли от темы.
То, что тут:
var f: (byte)->byte;
Не позволяет писать скобки - это не то же самое что p1() => p1. Это совсем из другой оперы.
Не нарушают, Вы правы. Поэтому я и написал, что можно писать и в стиле старого Pascal без проблем. Но новые фичи, все же, новые синтаксические конструкции, хотя бы для пользователя. Разве они есть в стандарте языка? Нет.
Я в первом посте предлагал разрешить писать в самой лямбде скобки вокруг единственного её параметра. Про типы делегатов я ничего не говорил.
По крайней мере - то, на что отвечал @RAlex - это вот это:
Но возможность не писать скобочки никак не относится к заголовку этой темы, @Gleb перепутал это, но если задуматься - в этих 2 случаях нет ничего общего, кроме факта что они касаются скобочек.
@RAlex, @Sun_Serega, @MrFresnel, я не предлагал запретить вызов без скобочек. Я предлагал сделать предупреждение об этом, как это сделано с for. Вот от этого
Зато, что весьма вероятно, исправили свой допотопный for на современный. То же самое касается и вызовов.
Вы считаете требование скобок современным кодом, а их отсутствие архаизмом по своей обычной логике “потому что так сделано в С++” ? Я вот считаю архаизмом писать тупые пустые скобки, хранящие внутри “ничего”. Да еще предлагаете предупреждение писать, о том, как это несовременно? Занятная мысль…