LINUX.ORG.RU
ФорумTalks

лямбды в новых язычках - PR или реальные полезняшки?

 , ,


7

7

Народ, а поясните пожалуйста, что конкретно имеется ввиду, когда некто, описывая всякие плюшки новорожденного языка восторженно заявляет «там есть лямбды!».

Ну что есть lambda в каком-нибудь lisp я представляю и даже понимаю зачем оно и как им пользоваться. В lisp'е. А что имеется ввиду под «лямбдой» например, в C#?

Хотелось бы увидеть не только цитаты из википедии, а простенькие примеры того, как эта лямбда сильно упрощает жизнь, удобство даёт и всё такое. В виде примера кода, разумеется, с пояснениями почему тут именно лямбда крута и без неё некузяво.

Только чтобы это не было аналогом перлового однострочника типа

perl -e 'print sub{ $_[0] + $_[1]; }->(1,2)."\n";'
ибо в этом никаких новшеств и преимуществ нету.

Просто сдаётся мне что «лямбда» в нынешних сишарпах это пиарное название допотопных безымянных функций которые даже в перле есть и никаких новшеств в этом на самом деле нету.

★★★★★
Ответ на: комментарий от grim

Что, среди молодежи эльфов мало?

Некоторые эльфы считают себя «не эльфами», несут бред и не понимают о чем говорит человек. Если отбросить шелуху, то Stanson говорит о том, что в C#, с точки зрения поддержки лямбд, нету инноваций по сравнению с более старыми языками. Читай - поддержка платформой несколько ограничена. И с этой точки зрения он прав. Так что не стоит корчить из себя «специалиста в области», у тебя плохо получается.

SlothSpot
()

Когда я прочитал заголовок темы, у меня он вызвал реакцию типа «сделайте меня развидеть это».

язычки
полезняшки

Valdor ★★
()
Ответ на: комментарий от SlothSpot

Stanson говорит о том, что в C#, с точки зрения поддержки лямбд, нету инноваций по сравнению с более старыми языками.

Где в более старых языках LINQ?

tailgunner ★★★★★
()

Лямбды хороши вместе с замыканиями.

theNamelessOne ★★★★★
()

Просто сдаётся мне что «лямбда» в нынешних сишарпах это пиарное название допотопных безымянных функций которые даже в перле есть и никаких новшеств в этом на самом деле нету.

Если-бы я был админом ЛОРа, я-бы тебе прямо сейчас накрутил Over9000 единиц скора. Ибо ты Великий Аналитег!

drBatty ★★
()
Ответ на: комментарий от Virtuos86

Неа, просто позабавило когда узнал об этом.

encyrtid ★★★★★
()
Ответ на: комментарий от linuxnewb

Это ключевой момент текущей драмы

Да ладно, больше на комедию похоже.

geekless ★★
()
Ответ на: комментарий от SlothSpot

Если отбросить шелуху, то Stanson говорит о том, что в C#, с точки зрения поддержки лямбд, нету инноваций по сравнению с более старыми языками

В промышленных языках обычно инноваций и не бывает. Утверждение что лямбды в C# - инновация существует только во влажных фантазиях ТС-а.

Читай - поддержка платформой несколько ограничена. И с этой точки зрения он прав.

Поддержка чего конкретно в C# ограничена?

encyrtid ★★★★★
()
Ответ на: комментарий от grim

Анонимными функциями лямба-исчисления не ограничиваются.

вас не затруднит ОБЪЯСНИТЬ ЗАЧЕМ? а ваши примеры я-бы переписал короче и проще.

drBatty ★★
()
Ответ на: комментарий от tailgunner

Я не понимаю этого языка (и не знаю Перла). Вот пример на Питоне:

ну и чем это принципиально отличается от

#include <stdio.h>

int f(int x)
{
	return x + 1;
}

int main(void)
{
	int (*p)(int) = f;
	printf("%d\n", p(2));
	return 0;
}
только тем, что int f(int) имеет своё имя, а у тебя - не имеет?

drBatty ★★
()
Ответ на: комментарий от encyrtid

В крестовых лямбдах, с их идиотским синтаксисом, особого смысла нет.

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

drBatty ★★
()
Ответ на: комментарий от geekless

Или даже так:

и в чём фишка? ну накрутил ты какую-то НЁХ, я её даже распарсил. Да, круто. НА ПРАКТИКЕ это зачем надо?

drBatty ★★
()
Ответ на: комментарий от drBatty

Это всё мне напоминает старый анекдот: Приходит Гоги к папе:

- папа, дай денег

- научись сначала сам себя в попу иметь

...прошло 20 лет

- папа, я научился!

- вот как научишься ЭТИМ деньги зарабатывать - приходи.

drBatty ★★
()
Ответ на: комментарий от drBatty

Определи f внутри main с замыканием на контекст main.

ЗАЧЕМ? Хвастаться?

Затем что в сишке ты этого не сделаешь. В этом и отличие. На практике замыкания удобны и используются очень часто.

encyrtid ★★★★★
()
Ответ на: комментарий от tailgunner

Где в более старых языках LINQ?

В тех, где есть карирование же, разве нет? Или я тут совсем суть упускаю? (с линк2сиквел игрался, но в продакшене не применял)

SlothSpot
()
Ответ на: комментарий от encyrtid

В промышленных языках обычно инноваций и не бывает. Утверждение что лямбды в C# - инновация существует только во влажных фантазиях ТС-а.

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

SlothSpot
()
Ответ на: комментарий от encyrtid

Поддержка чего конкретно в C# ограничена?

Лямбда-вычислений же

SlothSpot
()
Ответ на: комментарий от SlothSpot

Он как раз вопрошал о том, почему эту фишку выдают за нанотехнологии будущего при пиаре дотнета и шарпа

Кто выдает? Кроме как от ТС-а я подобного нигде не слышал.

encyrtid ★★★★★
()
Ответ на: комментарий от encyrtid

Затем что в сишке ты этого не сделаешь.

на С можно всё :)

Следи за руками:

1) Берём мой пример лямбды в новых язычках - PR или реальные полезняшки? (комментарий)

2) Модифицируем его следующим образом - в бинарники сишных программ можно добавлять отладочную инфу, в том числе исходники программы. Следовательно можно в рантайме извлекать исходный код и парсить контекст, из которого был сделан данный конкретный вызов lambda()

3) Переделываем lambda() в макрос, который оборачивает переданное ему тело лямбды в комментарии, а сам дергает функцию из 1) под другим именем с параметрами __FILE, __LINE. Это чтобы код вообще изначально компилировался

4) вызванная функция находит тело лямбды, завёрнутое в комментарии. Парсит контекст и заменяет в коде лямбды все обращения к переменным контекста разыменованиями вычисленных указателей на переменные контекста.

5) Потом полученный код лямбды скармливается компилятору, линкуется в *.so, прилинковывается к программе, и указатель на новую сгенеренную функцию возвращается в качестве результата

Harald ★★★★★
()
Ответ на: комментарий от SlothSpot

>Где в более старых языках LINQ?

В тех, где есть карирование же, разве нет? Или я тут совсем суть упускаю? (с линк2сиквел игрался, но в продакшене не применял)

Еще добавлю: для меня линк представляется своего рода сахаром над ФВП + карирование или над чейнингом. Потому либо не вкурил всю его прекрасность или тут инновации снова нету.

SlothSpot
()
Ответ на: комментарий от drBatty

только тем, что int f(int) имеет своё имя, а у тебя - не имеет?

Ты не понял. Ты почитай рассуждения про то, что указатели это не настоящие функции, и анонимные функции это не настоящие лямбды. А ты хочешь какое-то имя, идентификатор, прости господи, приравнять к самой Функции! Как тебе не стыдно только!

Xellos ★★★★★
()
Ответ на: комментарий от encyrtid

Кто выдает? Кроме как от ТС-а я подобного нигде не слышал.

Ок, значит я просто не понял его посыл. Хотя LINQ и лямбды были чуть-ли не важнейшими нововведениями платформы .NET 3.5 (в разрезе C#) и в свое время об этом достаточно много шума было.

SlothSpot
()
Ответ на: комментарий от wota

libtcc

Т.е. средствами самого языка это сделать не получится. Ты же не будешь применять на практике эту анальную акробатику?

encyrtid ★★★★★
()
Ответ на: комментарий от SlothSpot

Хотя LINQ и лямбды были чуть-ли не важнейшими нововведениями платформы .NET 3.5 (в разрезе C#) и в свое время об этом достаточно много шума было.

Это да.

encyrtid ★★★★★
()
Ответ на: комментарий от encyrtid

Т.е. средствами самого языка это сделать не получится. Ты же не будешь применять на практике эту анальную акробатику?

А что, libtcc, gcc, динамический линковщик разве не на С написаны? :)
Выходит, что средствами самого языка это и делается

Harald ★★★★★
()
Ответ на: комментарий от Harald

А что, libtcc, gcc, динамический линковщик разве не на С написаны? :)
Выходит, что средствами самого языка это и делается

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

encyrtid ★★★★★
()
Ответ на: комментарий от encyrtid

Т.е. средствами самого языка это сделать не получится

для меня большой разницы нет, можно решить использованием библиотеки - и хорошо

Ты же не будешь применять на практике эту анальную акробатику?

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

wota ★★
()
Ответ на: комментарий от theNamelessOne

В C функция не является объектом первого класса (указатель на функцию - является) и замыканием.

А в C++ класс является?

drBatty ★★
()
Ответ на: комментарий от drBatty

ЗАЧЕМ?

например лямбды в новых язычках - PR или реальные полезняшки? (комментарий)

можно грабить^W обрабатывать возвращаемые запросом данные без того, чтоб каждый раз переписывать один и тот же код. Без этого — я даже не знаю, как извращаться надо, поэтому пхп-код зачастую является эталоном програмирования копипастом.

linuxnewb
()
Ответ на: комментарий от Xellos

Ты не понял. Ты почитай рассуждения про то, что указатели это не настоящие функции, и анонимные функции это не настоящие лямбды. А ты хочешь какое-то имя, идентификатор, прости господи, приравнять к самой Функции! Как тебе не стыдно только!

в том-то и дело, что не хочу. Если в классической сиешчке функция имеет имя - это ничего не значит, и ничего не говорит - у меня исходник имеется, долго что-ли патч написать, чтоб делать функции без имени? В 10 раз быстрее, чем ломать голову над синтаксисом. Но никто не может мне сказать - ЗАЧЕМ нужны эти лямбда-функции? Для доказательства вычислимости? Принято. А программы-то зачем в них писать? Если мы УЖЕ доказали вычислимость?

drBatty ★★
()
Ответ на: комментарий от drBatty

Класс не является объектом первого класса (такая вот тавтология), его экземпляр - да. Ни класс, ни его экземпляр не являются замыканиями, но метод экземпляра является замыканием по отношению к полям экземпляра. Именно эти свойства использовались в C++ для создания т.н. функциональных объектов до того, как в нем появились лямбды.

theNamelessOne ★★★★★
()
Ответ на: комментарий от Reset

В связке с шаблонами это сильно сокращает код.

я видел ваш сишарповский код - «имена» ваших переменных в среднем состоят из 200 символов, примеры тебе известны (см. тему про $HOME). И что ты «сокращаешь»? Количество скобок что-ли? Давай пример что-ли, как у тебя код «сократился», а я подумаю, как его переписать на сишечку или даже на C++. Вот и посмотрим. Что воду в ступе толочь?

drBatty ★★
()
Ответ на: комментарий от linuxnewb

например лямбды в новых язычках - PR или реальные полезняшки? (комментарий)

чем плох сишный указатель на функцию, который делает в точности тоже самое? Только более понятно и более безопасно (ибо прототип функции приходится точно и явно указать. А в php получится НЁХ. Если совсем голова больная - так можно сделать в C++)

обрабатывать возвращаемые запросом данные без того, чтоб каждый раз переписывать один и тот же код.

callback функции придумали задолго до лямбд. Что в этом «передового»?

Без этого — я даже не знаю, как извращаться надо

открой для себя man 3 qsort

Да, уродливо конечно, но работает. И работает хорошо. В C++ это ещё и красиво.

drBatty ★★
()
Ответ на: комментарий от theNamelessOne

Класс не является объектом первого класса (такая вот тавтология), его экземпляр - да.

очевидно, что я про объекты.

Ни класс, ни его экземпляр не являются замыканиями, но метод экземпляра является замыканием по отношению к полям экземпляра. Именно эти свойства использовались в C++ для создания т.н. функциональных объектов до того, как в нем появились лямбды.

это всё очень познавательно, но не даёт ответа на вопрос «зачем?».

drBatty ★★
()
Ответ на: комментарий от geekless

компилятор и так всё прооптимизует в лучшем виде

портянка выше как раз и была про то, как это оптимизирует компилятор. Для разных предположений компилятором генерится несколько разных байткодов. Разные контексты выполнения задают лямбде разные предположения. Поэтому в зависимости от контекста выполнения у лямбды будет разный байткод. Если я правильно понял Stanson, это именно то, что он хочет (кроме того, так и делается везде).

stevejobs ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.