LINUX.ORG.RU
ФорумTalks

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

 , ,


7

7

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

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

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

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

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

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

★★★★★

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

SICP

Удивительно, что раньше не опчепятывался, с таким-то влиянием

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

А правда, что низкопрофильные шины дают какое-то приемущество, или это модное название древнего колеса?

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

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

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

Не ну чисто по возрасту-то это так.

CL (1994), clojure (2007) - не соглашусь.

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

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

Особенно для C# эта аллегория подходит.

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

CL (1994), clojure (2007) - не соглашусь.

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

// Или бывают лиспы без макросов? Если бывают, то зачем?

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

почему ты ожидаешь какого-то другого поведения от foo() например?

Я не ожидаю другого поведения от foo(). Какая разница - есть ли у некоей подпрограммы имя, или её по адресу дёргают? Анонимная функция, неанонимная - вести они себя будут одинаково.

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

Если считать, что ключевыми фичами любого лиспа являются гомоиконность и макросы

и символы :) + реализация: repl, compile, clos, mop, ...

Или бывают лиспы без макросов?

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

Если бывают, то зачем?

Лисп однажды просто открыли, не изобрели, а именно открыли. А вот макросы уже изобрели.

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

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

private const string boolParam = "ignoreCase", strParam = "output=", arrParam = "ignoreList=";
static void Main(string[] args)
{
    string output = "defaultFileName";
    string[] ignoreList = null;

    bool ignoreCase = args.Contains(boolParam);

    output = (from str in args
              where str.StartsWith(strParam)
              select str.Substring(strParam.Length)).FirstOrDefault();

    var listArg = args.Where(x => x.StartsWith(arrParam)).FirstOrDefault();
    if (!string.IsNullOrEmpty(listArg)) 
        ignoreList = listArg.Substring(arrParam.Length).Split(',');

    Console.WriteLine("ignoreCase:{0}, output:{1}, attrs2ignore:{2}", 
                       ignoreCase, output, ignoreList == null ? "" : string.Join(";", ignoreList));
}
Какой код проще, очевиднее легче в сопровождении?

И да - порядок аргументов любой, аргументы стандартны, в отличии от.

«В отличие от» чего? В отличие от моего работающего кода, ваш нерабочий?

Но анонимным функциям и #define 100 лет в обед.

А кто-то говорит что это изобрели вчера? В C# они изначально были.

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

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

Повторю ещё раз в С, Perl 5, C#,Java лямбда выражения ограниченные.

Но в С# они наиболее полно реализованы из перечисленных выше плюс были добавлены некоторые дополнительные языковые конструкции для упрощения записи лямбд и поэтому в C# гораздо удобнее и эффективнее чем в любом из перечисленных выше ЯП.

Поэтому попытавшись применить неполноценную версию вы и мучаетесь вопросом «зачем?» Это, я тоже уже несколько раз вам говорил.

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

То, что может при использовании лямбды как генератора функций в качестве результата вернуть новую функцию, которую никто в коде явно не писал. Как в учебнике по ФП написано.

Это кэринг.
Пример на C# я вам приводил.
Это часть лямбда калкулуса

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

Я не ожидаю другого поведения от foo()

а почему тогда ты требуешь, чтоб она генерила какой-то «новый» код? вместо того, что бы просто вернуть функцию.

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

подпрограммы

блджад, вот же оно! Просто ты нихрена не понимаешь разницу между подпрограммой и функцией

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

Какой код проще, очевиднее легче в сопровождении?

Пусть ответят на это прочие участники срачика.

«В отличие от» чего? В отличие от моего работающего кода, ваш нерабочий?

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

А кто-то говорит что это изобрели вчера? В C# они изначально были.

«Изначально» для C# по сравнению с С - это смешно.

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

Замечательно. Теперь осталось только рассказать, какие возможности лямбды в С# являются новшеством или хотя бы киллер-фичей настолько, что стоит это наличие лямбды как-то особо упоминать.

Но в С# они наиболее полно реализованы

О Господи. Да скажите уже наконец, в чём же эта полнота конкретно выражается? Типа «вот эдак ни на каком лиспе лямбду не попользуешь, а на перле вот эдакое реализовать вообще невозможно».

Ну ё-мое, если разбираетесь в языке - то элементарно же можно это сделать!

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

Хоть одна лямбда в каком-нибудь языке возвращает ли реально _функцию_? Или возвращаются всегда всякие ссылки на объекты, указатели на чо-нибудь, прочая ботва, что угодно, кроме собственно новой функции?

Я охренел и «надеюсь, что ты просто троллишь столь неловко. потому что таких тупых просто не бывает в природе.»
А функции передаются как божья благодать или астрал?
Я всегда думал что это указатель на объект/код а тут вот оно как, Михалыч!

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

Да не, там про «новую функцию, которую никто в коде явно не писал», и из других постов видно,что речь таки о генерации кода. Обрати внимание.

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

а почему тогда ты требуешь, чтоб она генерила какой-то «новый» код? вместо того, что бы просто вернуть функцию.

Потому что в C# оказывается не анонимные функции, которые ничего не могут вернуть кроме некоего значения, например, адреса, а лямбды. А лямбда, согласно учебнику возвращает функцию, а не какой-то там её адрес.

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

Я всегда думал что это указатель на объект/код а тут вот оно как, Михалыч!

Указатель - это адрес. А функция - это кусок кода.

Вот функция:

int func( int a, int b )
{
  return a + b;
}

А вот можно сделать указатель на неё:

void *p = func;

И 32/64 бита p ну никак не являются собственно функцией.

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

насколько я не знаю C#, в нем вообще нет никаких адресов

Скорее «юзеру не позволено видеть адреса и оперировать ими». И поэтому пришлось городить костыли в виде лямбд и прочего.

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

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

Я его не смог откомпилировать, поэтому он нерабочий.
Для моего только using и клас-обёртку добавить:
[code]using System;
using System.Linq;

namespace linq_params
{
class Program
{
[my code]
}
}[/code]

«Изначально» для C# по сравнению с С - это смешно.

Смех без причины признак «Stanson»
Изначально - с версии 1.0 и много мозгов для того чтобы это понять не нужно.

Замечательно. Теперь осталось только рассказать, какие возможности лямбды в С# являются новшеством или хотя бы киллер-фичей настолько, что стоит это наличие лямбды как-то особо упоминать.

Потому что они увеличивают эфективность программирования.
Это я уже писал.

Да скажите уже наконец, в чём же эта полнота конкретно выражается? Типа «вот эдак ни на каком лиспе лямбду не попользуешь, а на перле вот эдакое реализовать вообще невозможно».

Я это уже писал: лямбды в новых язычках - PR или реальные полезняшки? (комментарий)
Что непонятного?

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

Да не, там про «новую функцию, которую никто в коде явно не писал», и из других постов видно,что речь таки о генерации кода. Обрати внимание.

Это он от безграмотности.
Мне все-же кажется что он кэринг имел в виду, когда одному из аргументов можно присвоить значение и получится новая функция, как я писал для C#: лямбды в новых язычках - PR или реальные полезняшки? (комментарий)
или лямбды в новых язычках - PR или реальные полезняшки? (комментарий)

Хотя после перлов о функциях и указателях, я начинаю сомневаться в его разумности.

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

в анус себе пальцем ткни

Common Intermediate Language (сокращённо CIL) — промежуточный язык

промежуточный

Забей. Негоже эльфу с лямбдами выдрачиваться. Проституция приятнее и выше оплачивается!

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

Потому что в C# оказывается не анонимные функции, которые ничего не могут вернуть кроме некоего значения, например, адреса, а лямбды. А лямбда, согласно учебнику возвращает функцию, а не какой-то там её адрес.

Вы хоть понимаете, то что пишете?

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

Вот функция:
А вот можно сделать указатель на неё:
И 32/64 бита p ну никак не являются собственно функцией.

Ваши познания в программировании настолько убоги а упёртость настолько велика, что вы просто феномен какой-то.

Вы точно не тролите а просто тупой?

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

Скорее «юзеру не позволено видеть адреса и оперировать ими». И поэтому пришлось городить костыли в виде лямбд и прочего.

OMG!
Пожалуй вы действительно не тролите
Не мог поверить!

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

Я его не смог откомпилировать, поэтому он нерабочий.

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

Ладно, вот прям проверенный код:

#include <stdio.h>
#include <string.h>
#include <getopt.h>

int main(int argc, char *argv[])
{

int ret, cnt = 0, i, _bool = 0;
char *_string = NULL, *s;
int _data[1024];

 static struct option long_options[] =
 {
   {"bool", no_argument, 0, 'b'},
   {"string", required_argument, 0, 's'},
   {"array", required_argument, 0, 'a'},
};

while ((ret = getopt_long (argc, argv, "bs:a:", long_options, NULL)) != -1)
        {
                switch(ret)
                {
                        case 'b': _bool = 1; break;
                        case 's': _string = strdup(optarg); break;
                        case 'a':
                            s = strtok(optarg, ",");
                            _data[cnt++] = atoi(s);
                            while(s = strtok(NULL, ","))
                            {
                                _data[cnt++] = atoi(s);
                            }
                            break;
                 }
        }

    printf("bool = %s\n", _bool ? "true" : "false" );
    printf("string = %s\n", _string);
    for( i = 0; i < cnt; i++ ) printf("array[%d] = %d\n", i, _data[i]);
}

Надо сохранить это в файл test.c

Компилят обычно командой

 gcc -o test test.c

Результат запуска будет таким:

$ ./test -b -s test -a 1,2,3,4,5
bool = true
string = test
array[0] = 1
array[1] = 2
array[2] = 3
array[3] = 4
array[4] = 5
$ ./test -s asdf -a 5,4,3,2
bool = false
string = asdf
array[0] = 5
array[1] = 4
array[2] = 3
array[3] = 2

Ну а про понятность и простоту поддержки, как я уже говорил, пущай другие судят. По мне - лучше сотню прог с обычным getopt поддерживать, чем одну с вашим нестандартным C#ным велосипедом.

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

обратите внимание, на то что я на 6 страницах вежливо, игнорируя оскорбления, пытался ответить на вопросы.

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

вот тут и задумаешься: а так ли уж неправ был Виталик?

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

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

Они пишут свои эльфийские функции, которые не имеют никакого отношения к тому, что же будет щёлкать их процессор (ну или VM). У них функция это не конкретный код, а некая аура, едрить, обладающая какими-то сюрреалистическими свойствами никак не относящимися к реальному миру. И адресов у них нету, потому что микрософт сказал, что адреса некошерны.

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

Теоретики, фигли.

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

Если считается, что вы хоть что-то понимаете в програмировании, то да, я тупой.

Ибо не хочется иметь ничего общего с теми, кто вообще не отдупляет как всё устроено, и не понимает, что любая функция в программе это не какая-то абстрактная херота, которая имеет исключительно математический смысл и существует исключительно в виде текста в каком-нибудь говноIDE, а совершенно конкретная последовательность команд процессора.

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

обратите внимание, на то что я на 6 страницах вежливо, игнорируя оскорбления, пытался ответить на вопросы.

Но так и не ответил. В очередной раз запостил своё позорище на сисярпе и пытался выдать это за аргумент.

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

Собственно ответ получен, хоть и не такой как хотелось бы сисярпщикам. :)

Заодно поглядел, до какой степени деградировал нынешний программист.

Всем спасибо, все свободны.

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

«Изначально» для C# по сравнению с С - это смешно.

Смех без причины признак «Stanson»
Изначально - с версии 1.0 и много мозгов для того чтобы это понять не нужно.

Вот только лапшать то не надо. Делегаты появились в C# 2.0, лямбды - 3.0 :) А вот указатели и сырая память были всегда (unsafe секции)

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

а вот не нужно, пожалуйста на поколения валить.

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

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

мои студенты,даже троечники, 17 лет назад такого сморозить не могли.

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

«\» — это как acii-вариант греческой буквы «лямбда» («λ»), типа похожа по написанию

И эти люди говорят что '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see' неинтуитивно.

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

кое-где это выдаётся типа за охренеть какое преимущество над тем же перлом и торжественно называется лямбдою

Мне показалось, или «кое-где» это «в этом треде»?

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

Экспертные системы не генерируют кода.

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

Написанные на Lisp - наверное. Написанные на Си и Фортране - нет.

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