LINUX.ORG.RU
ФорумTalks

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

 , ,


7

7

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

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

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

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

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

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

★★★★★

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

Совсем не понятно зачем оперировать с кодом. То что ты хочешь - макрос. Но это обычно не нужно. Фишка добавления лямбд именно в анонимности и замыкании контекста. Причем именно второе - ключевая и сильная фишка. Именно она очень сильно сокращает и упрощает код.

vertexua ★★★★☆ ()

Непонятный код для "яйцеголовых" посмотрели - посмотрите теперь код для людей

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

Теперь посмотрим нормальный язык программирования для программистов, а не для «яйцеголовых».

public class Hello {
    public static void main(String[] args) {
       new Thread(() -> { 
           while(true)  { 
              System.out.println("ProFFessor VSL Mauhuur"); 
           } 
       }).start();
    }
}

Качаем специальную сборку с http://jdk8.java.net/lambda/

(Обычная Java 8 обругает на source)

Делаем

$ java -version
openjdk version "1.8.0-ea"
OpenJDK Runtime Environment (build 1.8.0-ea-lambda-nightly-h1436-20121014-b61-b00)
OpenJDK Client VM (build 25.0-b05, mixed mode)

$ javac -version
javac 1.8.0-ea

$ javac Hello.java

$ java Hello

(Джадом можно посмотреть, что сгенерировалось.)

Простенький «синтаксический сахарок» и со вкусом.

:)))

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

cecil предоставляет возможность модифицировать и добавлять новый исполняемый код.

То, как именно это предлагается делать - очень убого, громоздко и крайне укушено. Для языка относительно высокого уровня модификация ассемблера - это же ужос. Как, например заменить имеющийся for( i = 0; i < 25; i++ ) на for( i = 24; i >= 0; i--) ? Ну и накладные расходы - сколько всякой херни нужно понаписать, чтобы заменить единственный опкод.

Самомодифицирующийся код на асемблере я лет 20 назад писал

но это дожен быть особый случай, иначе никто потом не разберется.

камменты рулят. Я тоже этим примерно лет 20 назад занимался. Но это было красиво, изящно и в тему, в отличии от этого вашего ужасного cecil.

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

Простой пример живого кода
IsCaseSecitive = !args.Contains(ignorecaseParam);
Сеситив

Manhunt писал?

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

«Автомобиль - это такая хрень с дверьми»

«А то бы ща сидел так, в окно глядел...»

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

Совсем не понятно зачем оперировать с кодом.

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

То что ты хочешь - макрос. Но это обычно не нужно.

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

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

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

То, как именно это предлагается делать - очень убого, громоздко и крайне укушено.

Ну, это как минимум есть в отличие от других технологий.

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

Те-же лямбды, вы так и не поняли зачем нужны но в теме нагадили.

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

Понятно. А вообще - есть ли хоть один язык, где лямбда может генерировать именно новый код для процессора? Именно «возвращать новую функцию».

С же :)


void *lambda(const char *code)
{
FILE *f;
void *so;

f = popen("gcc -x c -shared -fPIC -", "w");

fwrite("void lambda() {\n", 16, 1, f); 
fwrite(code, strlen(code), 1, f);
fwrite("}\n", 2, 1, f);

pclose(f);

so = dlopen("a.out", 0);

return dlsym(so, "lambda");
}

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

А говноплевательствовать

фигасе, какие только новые слова не узнаешь на ЛОРе

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

Ну, это как минимум есть в отличие от других технологий.

Иногда, лучше ничего не делать, чем делать так вот. За умного можно хотя бы сойти.

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

Аналогичное мнение я услышал когда в кругу гуманитариев ляпнул, что «Чёрный квадрат» Малевича - полная херня.

Те-же лямбды, вы так и не поняли зачем нужны но в теме нагадили.

Ну и зачем же нужны лямбды _на_самом_деле_ ? Откройте же скорее тайну сию.

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

тогда уж лучше взять libtcc и компилировать сразу в память

Не, с академической точки зрения во время изучения этой фичи вообще надо код сохранять в файлики а не через пайп компилятору скармливать. Чтобы потом академически интересоваться, что же напрограммировала себе программа :)

Ну а потом, конечно можно и libtcc, для release.

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

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

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

Stanson ★★★★★ ()

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

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

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

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

Иногда, лучше ничего не делать, чем делать так вот. За умного можно хотя бы сойти.

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

Аналогичное мнение я услышал когда в кругу гуманитариев ляпнул, что «Чёрный квадрат» Малевича - полная херня.

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

Ну и зачем же нужны лямбды _на_самом_деле_ ? Откройте же скорее тайну сию.

лямбды нужны чтобы эффективнее программировать.

почитайте хотя бы вики.

ах да, вы их не осилили.

думаю вам не помочь :(

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

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

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

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

Указатели на функции в C# это delegate которые были в языка изначально.

лямбды к ним прямого отношения не имеют.

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

лямбды нужны чтобы эффективнее программировать.

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

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

вы бы помолчали, может за умного сошли.

зачем писать о том чего не понимаете?

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

лямбды к ним прямого отношения не имеют.

Как это не имеют? У лямбды нет имени, но есть адрес, который и приходится неявно передавать туда, где эта лямбда юзается.

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

вы бы помолчали, может за умного сошли.

Мне не требуется «сходить» за умного. Мне это делать незачем и не для кого.

зачем писать о том чего не понимаете?

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

Не, ну а предлагается какая альтернатива? Жрать чо дают? Не задавая вопросов априори считать Малевича гением, а C# продвинутым современным языком программирования?

Не пойти ли вам, извиняюсь, в жопу с такими альтернативами?

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

Это не просто анонимная функция, это функциональный объект или объект первого класса.

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

лямбда функция это всего лишь анонимная функция

Чушь, не надо путать анонимные функции и лямбда-функции. Лямбда функции отличаются не синтаксисом (он тут вообще не причем), а тем что относятся к лямбда-исчислению. А то, что их путают - лишь популярная ошибка.

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

в чем вопрос-то?

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

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

И речь не только о лямбдах. И вот так у них - всё.

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

Как это не имеют? У лямбды нет имени, но есть адрес, который и приходится неявно передавать туда, где эта лямбда юзается.

Все используют адреса, но не все лямбды - поразмышляйте над этим.

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

Т.е. хвалёная лямбда в C#, например - всего-навсего старая добрая покрытая мхом анонимная функция прям как в перле или жабе?

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

Отличаются ли чем-то рекламируемые ныне как крутость и новшество в продвигаемых всякими конторами языках программирования «лямбды» от

Ответ либо «да», либо «нет», в зависимости от того, о каких «лямбдах» в каких языках от каких контор идет речь.

linuxnewb ()

Даже похапешники используют лямбды

function lol($query,$f)
{
  $return=array();
  $result=mysql_query($query);
  while($row=mysql_fetch_assoc($result))
    {
    $return[]=$f($row);
      }
  return($return);
}

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

В чём эта эффективность выражается?

Я уже приводил код по проверке параметров переданных приложению.

Рассмотрим запуск приложения application с необязательными параметрами
application boolParam stringParam=value arrayParam=value1,value2,value3
Нужны 3 действия:
1.Проверить наличие параметра который boolParam.
2.Проверить наличие и сохранить значение stringParam.
3.Проверить наличие и сохранить значение arrayParam в массив.
Приведите пожалуйста код на С и давайте сравним с моим кодом, который я писал не на выставку а взял из проекта.


Например, по сравнению с сишным механизмом указателей на функции.

Вы пытаетесь сравнить независимые сущности.
В С #define предоставляет некоторое подобие лямбда выражений, я вам об этом уже писал, но назвать это полноценными лямбдами нельзя, хотя можно постараться и написать код, который в опреденных ситуациях будет похож на лямбда-код

Или с перловыми анонимными функциями.

В Perl 5 есть анонимные функции которые можно использовать в лямбда выражениях, но closure не работает. Т.е. лямбда выражения в Перл есть и даже с карингом но неполноценное

Т.е. вы пытаетесь доказать, что лябда - это бесполезная сущность на основе неполноценных реализаций.

В Perl 6 с лямбда исчислением все просто прекрасно и лучше чем в C# который является пиком вашего непонимания, соответственно Perl 6 вы вряд-ли осилите в объеме достаточном для понимания лямбд и их применения в ЯП поддерживающих различные парадигмы программирования.

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

Ну, например, чтобы понять.

Когда пытаются понять - пишут вопросы.
Вы-же пишете утверждения, которые кажутся разумными только вам и только потому, что вы не желаете обращать внимания на ответы на ваши вопросы.
Или их просто не понимаете судя по [Мне не требуется «сходить» за умного.]

grim ★★★☆ ()

Лямбда - это анонимная функция, а тред какой-то «странный», мягко говоря.

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

Т.е. хвалёная лямбда в C#, например - всего-навсего старая добрая покрытая мхом анонимная функция прям как в перле или жабе?

А поразмышлять?
Подскажу аналогию:
Все состоит из атомов, но НЕ ВСЕ - стол.

И да, анонимные функции можно назвать лямбдами.

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

Давай на этом остановимся. Нигде то что ты хочешь никто ни разу лямбдой не называл. В лямбдах манипуляций с кодом не производят. Бывает разный порядок вычислений, строгий или ленивый, но всяких непонятных читов, которые ты описываешь никто в лямбдах не делает

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

Рассмотрим запуск приложения application с необязательными параметрами

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

int ret, i = 0, _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:d:", long_options, NULL)) != -1)
        {
                switch(ret)
                {
                        case 'b': _bool = 1; break;
                        case 's': _string = strtdup(optarg); break;
                        case 'a': while(s = strtok(optarg, ',')){ data[i++] = atoi(optarg, 10) } break;
                 }

...

}

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

Т.е. вы пытаетесь доказать, что лябда - это бесполезная сущность на основе неполноценных реализаций.

Нет, лямбда, в любой реализации, даже самой убогой, в виде анонимной функции или даже #define - это круто и удобно. Но анонимным функциям и #define 100 лет в обед. Как и лямбдам в лиспе каком-нибудь. И когда в качестве достоинства языка приводят в пример наличие лямбд у меня резонно возникает вопрос - если это достоинство - то неужто лямбду прям настоящую, как в учебнике по ФП сделали?

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

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

Не, открываем учебник на разделе lambda-calculus и читаем аглицким по белому что-то типа «Finally, any function that requires two inputs, can be reworked into an equivalent function that accepts a single input, and _as_ _output_ _returns_ _another_ _function_, that in turn accepts a single input.» (это из педивикии, но там оно из учебников)

Ну и возникает вопрос - хде собственно оно returns именно another function, а не фигню какую-то?

А если оно не _другую_ _функцию_ возвращает - то почему банальную фичу, которая есть почти везде, во всяких get the facts в качестве достижения выпячивают?

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

что в твоем понимании есть «лямбда прям настоящая»?

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

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

Это всё один и тот же код, но с разными предположениями.

Предположения мы можем выяснить на этапе статического анализа при первоначальной конпеляции

В принципе, это делается через механизм шаблонов. (Не в только Си++-смысле, а в целом как концепция.)

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

Таким образом, в подобной уличной магии я не вижу смысла.

А лябмды тут ваще ни прич ем.

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

Io по новизне и потенциалу круче С# на порядок, но про C# все знают, а про Io - почти никто.

Io в том виде, как он есть, невозможно оптимизировать. Его можно только:

  • Использовать во всяких скриптах-плагинах, где производительность не требуется вообще.
  • Использовать как формат хранения данных.
  • Сделать на его основе другой язык с более жесткими ограничениями, которые можно проверить в compile time. С нормальными макросами, опять же.
geekless ★★ ()
Ответ на: комментарий от linuxnewb

в Ruby, емнип, полноценные лямбды.

Т.е. если генерировать функцию используя лямбду то появится новый кусок кода?

C# не знаю, но про него тебе уже 4 страницы написали.

Угу, 4 страницы, а прямого ответа на простой вопрос нету. Всё вокруг да около, сто раз дураком назвали, а ответить чо за лямбда такая в C# - не могут. И кто тут дурак?

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

Io в том виде, как он есть, невозможно оптимизировать.

Зато идея достаточно свежая и принцип KISS соблюдён. Есть куда расти.

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