Скобочки для единственного параметра лямбда-выражения

С чем связано то, что нельзя писать скобочки для единственного параметра лямбда-выражения? В 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.

.

1 лайк

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

Это не попытка, а стандартный синтаксис языка. Попытка - это предложение запретить не писать скобки у функций без параметров. Тут уже что только не предлагали в раже, вплоть до разрешения вместо begin … end писать { … }

Думаю, весьма правдоподобное предположение.

В стандарте Pascal нет лямбда-выражений. Так что, неверно.

А ничего, что в стандартном синтаксисе лямбд вообще нет?

Предлагают то ведь не просто так. Проблем от вызовов без скобочек уже полно.

Это не предложение было, а критика языка от фаната C++.

1 лайк

Единственным аргументом за их сохранение я вижу совместимость с стандартом Pascal. Контраргумент - куча проблем. Отдельная тема, поэтому не буду расписывать.

А никто и не говорит об их сиюминутном запрете. Сначала - предупреждение, как с for без объявления параметра в заголовке. Не вижу катастрофы в этом. PascalABC.NET уже и так нарушил почти все каноны стандартных Паскалей, уступив в этом, пожалуй, только Oxygene. Я бы даже сказал так: от Паскаля в PascalABC.NET остался лишь набор ключевых слов и базовый синтаксис.

Верно подмечено. Это, кстати, еще один аргумент за введение этой фичи. Разве что typeclass’ами обогнал Oxygene.

1 лайк

Помнится, даже @Admin уже говорил о проблемах с грамматикой, вызванных как раз неоднозначностью вызов/ссылка.

Если утрировать, то от него остались только begin-end, что <sarcasm>достаточно много</sarcasm>.

1 лайк

А у лямбд скобки никто и не отнимает. () -> () считается нормальной записью, нельзя же писать var F ->

Проблемы есть и они решаются. До сих пор решались - никто не умер.

Да ничего практически он не нарушил! Если бы действительно нарушил - от него бы мгновенно массово отказались все школы и прочие учебные заведения. Все без исключения учебники описывают синтаксис максимум уровня Free Pascal, учителя и преподаватели не знают и знать не хотят никаких С-подобных Паскалей. Переделывать в таких условиях синтаксис в угоду кучке адептов языка С было бы огромным просчетом.

Мне бы хотелось услышать что-нибудь кроме “никто не умер”, и, наверное, другим тоже, поскольку от любого нововведения можно пытаться отказаться, аргументируя тем, что раньше его не было и

.

Вы уверены? В каком стандарте Pascal есть срезы, кортежи, лямбда-выражения, сокращенные записи методов/подпрограмм, делегаты, автоклассы, классы типов и т.д.? То, что учебники не описывают множество функционала языка, содержащего элементы современного программирования (например, лямбды), не повод говорить, что он ничего не нарушил. В PascalABC.Net можно писать в формате стандартного Pascal. И никаких противоречий здесь не наблюдается.

На счёт отказались - не думаю, что это кому-то это надо, так как это легковесная среда, в которой просто проводить обучение. А главное - удобно, так как нет загруженности интерфейса как в профессиональных IDE. Можно, конечно, было бы обучать в Free Pascal, но учащихся отпугивает старомодный интерфейс, который по сравнению с современными интерфейсами не совсем удобен.

1 лайк

Эти фичи строятся поверх, они не меняюсь базовый синтаксис, как возможность не писать скобочки когда они пустые.

Это понятно, но я показываю человеку, что этого нет в стандарте Pascal. Кстати, а какого Вы мнения о поднятом в теме вопросе?

А я вам говорю, что то что вы предлагаете, и те фичи которые были добавлены - это не одно и тоже. Добавленные фичи не нарушают старый синтаксис, поэтому ваш пример неправильный.

Вы бы сходили на куберфорум - увидели бы как много людей пишут в PABC.Net в стиле турбо паскаля. Т.к. сейчас есть совместимость - у них есть шанс переучится на более благоразумный стиль. А если в паскале поменяется что то на сколько фундаментальное - учителям будет проще использовать турбопаскаль, ибо большинство из них не понимает удобств IDE. А вот в турбопаскале не получится на нормальный стиль переучится, даже если захотеть.


Но вы всё же отошли от темы.
То, что тут:

var f: (byte)->byte;

Не позволяет писать скобки - это не то же самое что p1() => p1. Это совсем из другой оперы.

1 лайк

Не нарушают, Вы правы. Поэтому я и написал, что можно писать и в стиле старого Pascal без проблем. Но новые фичи, все же, новые синтаксические конструкции, хотя бы для пользователя. Разве они есть в стандарте языка? Нет.

Я в первом посте предлагал разрешить писать в самой лямбде скобки вокруг единственного её параметра. Про типы делегатов я ничего не говорил.

Можно поподробней? Я не совсем Вас понял.

По крайней мере - то, на что отвечал @RAlex - это вот это:

Но возможность не писать скобочки никак не относится к заголовку этой темы, @Gleb перепутал это, но если задуматься - в этих 2 случаях нет ничего общего, кроме факта что они касаются скобочек.

@RAlex, @Sun_Serega, @MrFresnel, я не предлагал запретить вызов без скобочек. Я предлагал сделать предупреждение об этом, как это сделано с for. Вот от этого

Зато, что весьма вероятно, исправили свой допотопный for на современный. То же самое касается и вызовов.

Вы считаете требование скобок современным кодом, а их отсутствие архаизмом по своей обычной логике “потому что так сделано в С++” ? Я вот считаю архаизмом писать тупые пустые скобки, хранящие внутри “ничего”. Да еще предлагаете предупреждение писать, о том, как это несовременно? Занятная мысль…

1 лайк

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