LINUX.ORG.RU
ФорумTalks

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

 , ,


7

7

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

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

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

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

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

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

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

Мне тут ещё никто так и не объяснил, на кой хрен нужны лямбды в императивных ЯП?

Чтобы не писать огромных простыней кода, которые тут демонтировал.

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

Что ж вы в сишечку с плюсами лезете?

А если код на плюсах, то обязательно должен быть простыней? Почему тут нельзя применять удобные техники ?

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

Ты доказал ненужную фигню о своем макросе, но не о LINQ.

Все эти linq-и всего лишь простые и очевидные вещи, которые изобретаются в других языках на ходу во время создания прикладных программ прикладными программистами, а не преподносятся как что-то супер крутое, подаренное создателями языка. Если это для тебя обидно, извини. Можешь дальше молиться на linq.

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

Чтобы не писать огромных простыней кода, которые тут демонтировал.

«функции» по типу x+y встречаются только в примерах. А ты ещё не доказал, что ФП приводит к экономии места IRL. Кроме того, я ЯВНО выписывал указатели на функции, во первых можно было-бы писать typedef, как это делается IRL, во вторых объявляешь ты один раз,а используешь Over9000. Потому объявления места IRL почти не занимают.

Ну и ты не показал того, что нет никакого профита от того, что компилятор ВСЕГДА знает, ЧТО это за переменная. Мне очевидно, что профит от того есть, и немалый.

И наконец, те лямбды, что тут привёл ты (в C++) отличаются совершенно диким и неудобочитаемым синтаксисом. У тебя есть CL, в нём лямбы смотрятся нормально. А не как вот эти сиски.

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

Кроме того, я ЯВНО выписывал указатели на функции, во первых можно было-бы писать typedef

При чем тут typedef? Чтобы эмулировать «замыкание» в сях тебе надо вводить дополнительную сущность-структуру и сохранять там «контекст». И так на каждий чих у тебя будет по _разной_ структуре. И да, ты задачу то не решил, а просто написал портянку херни.

«функции» по типу x+y встречаются только в примерах.

Это не так. Задача пробежаться по контейнеру и что-то с ним сделать встречается постоянно.

А ты ещё не доказал, что ФП приводит к экономии места

А мне и не надо этого делать, ты сам всё за меня доказал.

Ну и ты не показал того, что нет никакого профита от того, что компилятор ВСЕГДА знает, ЧТО это за переменная. Мне очевидно, что профит от того есть, и немалый.

А это тут при чем?

И наконец, те лямбды, что тут привёл ты (в C++) отличаются совершенно диким и неудобочитаемым синтаксисом.

Где в нем дикость и неудобство? Обычное описание функции, просто перед описанием пишем квадратные скобки с опциональным описанием того контекста, который будем замыкать.

У тебя есть CL, в нём лямбы смотрятся нормально.

Ну и? А я хочу на плюсах писать без портянок.

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

При чем тут typedef?

при том, что большинство букв я потратил на явное описание ТИПА, что-бы показать то, что это не просто НЁХ, а функция, которая возвращает указатель на функцию, которая возвращает целое, и принимает в качестве аргументов два целых; и принимает в качестве аргумента указатель на функцию... И т.д. лениво расписывать. А вот в питоне просто x, который ВНЕЗАПНО оказывается хрен пойми чем. Оно конечно занимательно, но в случае чуть сложнее хэлловорлда это не по детски рвёт шаблон.

Чтобы эмулировать «замыкание» в сях тебе надо вводить дополнительную сущность-структуру и сохранять там «контекст». И так на каждий чих у тебя будет по _разной_ структуре. И да, ты задачу то не решил, а просто написал портянку херни.

ты бредишь: в ФП всё построено на функциях, которые принимают параметры, и возвращают результат. ВСЁ. Функции в ФП больше НИЧЕГО не делают и не имеют побочных эффектов. Я НЕ говорю, что это плохо. Это классная фича ФП. Вот только это НЕ всегда хорошо. Потому нужен костыль - замыкание. В императивных ЯП замыкания не нужны, ибо функции имеют побочные эффекты. Есть и глобальные переменные, видимость которых можно ограничить одним файлом(если тебе не нужны «суперглобальные», а они конечно почти никогда не нужны).

Это не так. Задача пробежаться по контейнеру и что-то с ним сделать встречается постоянно.

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

А мне и не надо этого делать, ты сам всё за меня доказал.

практического смысла в обоих примерах - ноль целых и ноль десятых. И ты это знаешь.

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

при том, что большинство букв я потратил

не на это ты потратил большинство букв

ты бредишь:

Бредишь тут только ты.

конечно вводить для этого особую функцию тебя Патрег заставляет? Или Гейтс?

В Си++ есть boost::bind и лямбды, поэтому особую функцию вводить мне не придется.

В лиспе - да. Там всё на функциях, даже циклы.

В каком лиспе? В CL ? Тут ты опять в лужу сел, ибо еще раз повтрю, что CL в том числе и императивный язык.

практического смысла в обоих примерах - ноль целых и ноль десятых. И ты это знаешь.

Из таких примеров вырастает серьезный код. Пример посложнее с асинхронными сервером на boost::asio ты не осиливаешь, а в простых примерах видите ли нет практического смысла. Тут в очередной раз демонстрируешь свою недалекость и скудоумие.

А что фразу «а это тут при чем?» проигнорировал? Боишься, что опять в лужу сядешь?

Reset ★★★★★
()
Последнее исправление: Reset (всего исправлений: 1)
Ответ на: комментарий от Reset

Ну и ты не показал того, что нет никакого профита от того, что компилятор ВСЕГДА знает, ЧТО это за переменная. Мне очевидно, что профит от того есть, и немалый.

А это тут при чем?

очевидно при том, что в питоне компилятор (и быдлокодер) ничего не знает о типе переменной. И это - плохо.

Где в нем дикость и неудобство? Обычное описание функции, просто перед описанием пишем квадратные скобки с опциональным описанием того контекста, который будем замыкать.

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

Ну и? А я хочу на плюсах писать без портянок.

ну пиши. вот тебе факториал:

	for(y = 1; x; x--)
		y *= x;
а вот lisp
 (defun factorial (n)
    (if (< n 1)
      1
      (do ((f 1) (i 2 (1+ i)))
        ((> i n) f)
        (setq f (* f i)))))
где букв меньше, и код понятнее?

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

В Scala видел, понравилось. А жаба сама по себе многословная.

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

В Си++ есть boost::bind и лямбды

в C++ нет boost, а лямбды пока в проекте.

В каком лиспе? В CL ? Тут ты опять в лужу сел, ибо еще раз повтрю, что CL в том числе и императивный язык.

см. выше пример «компактного» и «понятного» кода. Да, там императивный do.

Из таких примеров вырастает серьезный код. Пример посложнее с асинхронными сервером на boost::asio ты не осиливаешь, а в простых примерах видите ли нет практического смысла. Тут в очередной раз демонстрируешь свою недалекость и скудоумие.

на кой хрен мне копаться в boost::asio? И так всё ясно.

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

очевидно при том, что в питоне компилятор (и быдлокодер) ничего не знает о типе переменной. И это - плохо.

Замечательно, а при чем тут лямбды? Они бывают и в языках со статической типизацией.

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

Сам то понял что сказал?

ну пиши. вот тебе факториал:

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

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

вот тебе факториал:

Это не факториал, это последствия упарывания кокосом. А факториал на сях — вот:

long factorial(long n)
{
    long result = 1;
    long i;
    for (i = 2; i <= n; i++)
        result *= i;
    return result;
}
Добрый совет: не принимай тяжелые наркотики.

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

в C++ нет boost

В стандарте нет, но это библиотека, которую мне никто не запрещает подключать и использовать, что я и делаю.

а лямбды пока в проекте.

Нет, они уже в стандарте и есть в компиляторах.

на кой хрен мне копаться в boost::asio?

А я и не прошу тебя в нем копаться, а прошу разобраться с примером на нем. Ты хотя бы раз в жизни писал асинхронный сервер или только на хелловорлдах специализируешься? Если бы писал, что знал бы какой это адов ад делать цепочку колбеков, по колбеку и отдельной структуре на каждый чих.

И так всё ясно.

С тобой — да

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

нет, почему бы не быть ФП везде и доступным всем

vertexua ★★★★★
()
Ответ на: комментарий от drBatty
(defun fact (n)
  (loop for i from 1 to n
        for fact = 1 then (* fact i)
        finally (return fact)))
lazyklimm ★★★★★
()
Ответ на: комментарий от drBatty

вот тебе факториал:
for(y = 1; x; x--)
y *= x;
где букв меньше, и код понятнее?

Вот-вот. Теперь с помощью твоего кода выдай мне последовательность факториалов. Например fact_list(2, 5) должно выдать 2,6,24,120.

Тут то Си покажет себя во всей красе.

В случае с лиспом

(defn fact [n] (reduce * (range 1 (inc n))))
(defn fact-list [n m] (map fact (range n (inc m))))

Проверяем: (fact-list 2 5) дает (2 6 24 120).

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

Был у меня опыт использования лисп-подобного синтаксиса. И был опыт нескольких лет отхождения от C-подобного синтаксиса. Что я могу сказать - C/Java/Perl вспоминаются на раз-два. А при взгляде на кучу скобок видишь только одно - «синтаксис языка не позволяет объяснить это решение вам». Я не спорю, если я начну сейчас писать на лиспе, через годик я буду парсить такие программы не хуже lex-а. Но для вхождения в C-синтаксис не требуется года.

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

Странно. Получается, у тебя какой-то уникальный опыт. Ты писал на лиспе плотно хотя бы с неделю? Или так, пару примеров делал?

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

Тут то Си покажет себя во всей красе.

(defn fact-list [n m] (map fact (range n (inc m))))

while(n <= m) fact(n++);

вычисляет все твои 2! 3! 4! 5!

А в чём прикол-то?

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

Получается, у тебя какой-то уникальный опыт.

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

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

Список где?

нету. А зачем список? Ты писал:

выдай мне последовательность факториалов.

получите, распишитесь.

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

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

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

Можно оформить код всей функции?

list* fact_list( int n, int m )
{
    list* l = create_list();
    for( int i = 1, f = 1 ; i <= m ; f *= ++i )
	if( i >= n ) push( l, f );

    return l;
}
...
list* l = fact_list( 2, 5 );

как-то так

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

Тогда где код выделения памяти, куда кажет sp?

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

Ок. Спрошу точнее. Напиши функцию для выдачи последовательности факториалов.

т.е. их куда-то в память надо занести? дык...

int stack[100];//create list
int *sp = stack;//create list pointer
while(n <= m) *sp++ = fact(n++);//push
drBatty ★★
()
Ответ на: комментарий от drBatty

Почему 100? В задаче нет точной цифры.

Если можно, то запость весь код функции со всеми определениями, а не кусками.

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

где описание create_list и push?

в С есть разные библиотеки для списков, можешь просто заменить данные функции на g_slist_alloc + g_slist_append, например

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

Неужели сложно просто без лишних слов запостить весь код? Ну и дела.

я ж написал - «можешь просто заменить данные функции на g_slist_alloc + g_slist_append», это будет весь код, т.к. данные функции часть glib, а не твоего кода

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

Интересно, почему ты не хочешь запостить весь код с хидерами и кодом функции. Очень странно.

от тебя определенно что-то скрывают

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

Определенно скрывают слив.

несомненно, он определенно находится в хедере glib либо в замене названий функций, ох не зря это было сделано

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

Почему 100? В задаче нет точной цифры.

потому-что посчитай факториал от 100 своей программой на своём лиспе, и удивись, она тоже считает неправильно (:

потому-что это факториал.

Если можно, то запость весь код функции со всеми определениями, а не кусками.

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

#!/usr/bin/php
<?php
$n = 2;
$m = 5;
while($n <= $m)
{
	$x = $n++;
	for($f = 1; $x; $x--)
		$f *= $x;
	$a[] = $f;
}
print_r($a);
?>
этот говнокод можно и в две строчки записать, если тебе так хочется. Но так оно ИМХО лучше читается.

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