LINUX.ORG.RU
ФорумTalks

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

 , ,


7

7

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

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

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

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

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

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

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

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

ну добавь. А мы посмотрим.

Но, нужно заметить, не контекста как такового, а его куска, просто указателя на стек, по сути, причём ручной его передачи. А то так - вернул замыкание и всё, поставил там [=], [&] или что нужно, если говорить про C++.

я немного не понял - ну «куска». Разве «кусок» не частный случай целого? Отправь в функцию ВЕСЬ контекст, только лично мне непонятно - нахрена? без всяких [=] я могу отправить в функцию нужный мне кусок контекста, зачем мне ещё что-то?

Кстати, ответ на вопрос «зачем нужны функции вида lambda (int x) { return x > 5; }» - затем, что можно писать код состоящий из комбинаторов, частичных применений, лямбд и секций чуть более, чем полностью. Ты же не захочешь расписывать сложное арифметическое выражение в SSA? Вот и тут так же.

ну а ты в состоянии абстрагироваться от функций? Ты вообще можешь понять, что иногда сигара - это просто сигараx+y это просто x+y, а не лямбда-функция, возвращающая код, который прибавляет к x какое-то y? Почему ты вдруг решил, что «код состоящий из комбинаторов, частичных применений, лямбд и секций чуть более, чем полностью» проще записи if(x>5)...?

Но иногда же удобно

удобно. Иногда.

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

Беда в том, что e это тоже eval, только выполняется он не над тем, что ввёл программист, а над тем, что ввёл КЛИЕНТ

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

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

Да понимаю я суть ФП, уж наверно лет 20 как.

т.е. вам уже за 30-ть? Или вы еще в школе понимали ФП?

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

А что еще должно быть у ЯП?

Ritmik
()

Я на лиспе программы писал, когда C# ещё и в страшных снах Баллмера не было

тьфу ты, это ж Золотце! Расходимся, посоны, нас обманули.

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

т.е. вам уже за 30-ть? Или вы еще в школе понимали ФП?

За 40 вообще-то.

А что еще должно быть у ЯП?

Практическая польза. ЧСХ она даже еззь. Но об этом массы не знают.

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

нет. НЕ очевидно. Зачем оборачивать x+y в функцию, если можно записать x+y в цикле?

/0

Если завтра понадобиться опять x+y, то почему нельзя записать x+y ещё раз?

Потому что может не быть заранее известно, что будет именно x+y, а не x*y или x-y, а просто представлено формальным параметром или замыканием,

в БОЛЬШОМ коде объявления функций как занимали ТРИ строки, так и занимают.

Как раз объявление функции меня не интересует, а интересует тело функции.

Твои ФП лямбды интересны только для функций типа x+y.

Конечно «только для» этого, и ни для чего больше, ведь ты же так сказал.

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

т.е. вам уже за 30-ть? Или вы еще в школе понимали ФП?

За 40 вообще-то.

Солидно. Т.е. вы за 20 лет фп не освоили, что такое лямбды?

А что еще должно быть у ЯП?

Практическая польза

Конкретный такой ответ. Подробный и с примерами.

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

Кстати, отсюда следует, что лямбды нигде нынче не оптимизируются при вызове, т.е. вызов какой-нибудь абстрактной (define (myfunc f) (lambda(x) (f x x))) как ((myfunc -) 123) приведёт к тому, что процессор тупо будет из 123 вычитать 123 ?

Зависит от политик компилятора. Например:

(declaim (optimize (speed 3) (safety 0) (debug 0))
         (inline myfunc))

(defun myfunc (f)
  (lambda (x)
    (funcall f x x)))

(defun call ()
  (funcall (myfunc '-) 123))

(disassemble #'call)
; disassembly for CALL
; 02FB3D9F:       31D2             XOR EDX, EDX ; теперь EDX = 0
;       A1:       488BE5           MOV RSP, RBP
;       A4:       F8               CLC
;       A5:       5D               POP RBP
;       A6:       C3               RET

(defun empty ())

(disassemble #'empty)
; disassembly for EMPTY
; 03CE0D5F:       BA17001020       MOV EDX, 537919511 ; теперь в EDX хардкод nil
;       64:       488BE5           MOV RSP, RBP
;       67:       F8               CLC
;       68:       5D               POP RBP
;       69:       C3               RET

числа и прочие объекты пишутся в регистры без разбора потому что они отличаются по тегу (несколько бит от слова).

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

Не ты ли считал факториал вложенными циклами?

Конкретно в случае вычисления факториала — однозначно нет, не та задача. В других случаях надо смотреть индивидуально, но преждевременная оптимизация — безусловное зло. Во очень многих случаях ботлнек возникает в совершенно других местах даже при «МНОГОКРАТНОЕ использование таких ФУНКЦИЙ» (В реальности я лишь однажды столкнулся с ситуацией, когда именно «использование таких ФУНКЦИЙ» вызвало проблему, оптимальным решением которой оказалось «добавить памяти на сумму 0,5 человеко-дня»).

Такой проигрыш позволяет сильно упростить код (короче,понятнее), улучшить его структуру, повысить реюз и т.п., а следовательно сократить время разработки, отладки, облегчить сопровождение. Это все деньги, и не малые.

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

Солидно. Т.е. вы за 20 лет фп не освоили, что такое лямбды?

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

Я освоил и пользуюсь безымянными функциями.

Конкретный такой ответ. Подробный и с примерами.

Какой вопрос, такой ответ.

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

Зачем оборачивать x+y в функцию, если можно записать x+y в цикле?

Чтобы не повторять одну и ту же реализацию _цикла_ много раз.

fix

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

Солидно. Т.е. вы за 20 лет фп не освоили, что такое лямбды?

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

Новояз? Как не стыдно. Лямбды были раньше Си.

Мне это не нужно

Как вы можете говорить, что вам не нужно то, чего вы не понимаете?

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

Ага, то есть лисп как раз именно новую функцию в самом прямом смысле и возвращает, да ещё может и код её оптимизировать.

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

смотри выше, какая кривизна получается, если писать в императивном стиле на CL.

Конечно, факториалы нужно вот так писать:

(!) :: (ArrowChoice a, ArrowLoop a, ArrowApply a, Ord n, Num n) => a n n
(!) = loop $ proc (z0, r) -> do
  z <- r -<< z0
  returnA -< (
    z, proc n ->
     if n < 3
     then returnA -< n
     else do
       m <- r -< n - 1
       returnA -< (n * m)
    )
quasimoto ★★★★
()
Ответ на: комментарий от Ritmik

Новояз? Как не стыдно. Лямбды были раньше Си.

«Наркомпросвет» какой-нибудь был даже ещё раньше лямбд. Тем не менее это называется «новоязом».

Как вы можете говорить, что вам не нужно то, чего вы не понимаете?

Легко. Я вообще много чего не понимаю, и многое из этого мне не нужно. Копрофагию вот не понимаю например, и ЧСХ она мне ну вообще никак не нужна.

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

Мало для чего?

Мало для дальнейшего развития.

В том то и дело, что все, кто хотел пользоваться, пользовались.

На лиспе? На хаскеле?
Я на Scheme ни одного проекта не сделал, кроме мелких служебных программок, так как ни библиотек ни поддержки ни комьюнити по разработке к примеру вэб приложений.
Я очень рад что эти возможности появились в C# и я наконец могу их использовать а с появлением нормальных лямбд в Java смогу это делать ежедневно так как C#+Java ~= 90% моих проектов.

Результат этой попытки ты видел. А таких огромная масса.

Ну не все же Ельфы.
Часть все-же при попытке доказать что к примеру их Java может не хуже изучают Scala(откуда по моему и содран синтаксис лямбда-linq в C#) и таких на форуме много. Сначала они издеваются над C# и linq потом пытаются доказать что Java как платформа не хуже потом изучают Scala и вуаля, человек начинает излечиваться от безмозглого фанатизма.

А то вон лямбдами только гвозди^W в колбаках и в фильтрах и пользуются.

Я пользуюсь карингом и фанкторами и expression trees, но начинал именно с фильтров, калбаков и просто анонимных фукций лет сколько-то назад.
Они нужны не так часто, как фильтры так как в гибридном языке библиотеки все-же поддерживают в первую очередь OO

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

А те же «лямбды» в перле вообще постоянно пользую.

Как вы их могли использовать, если вы даже не возразили, когда я о каринге написал?

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

Хехе, я забыл о вашей цели не дискутировать а развлекать.
Спасибо.
Вы мне доставляете :)
Cheers!

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

Как вы их могли использовать, если вы даже не возразили, когда я о каринге написал?

Шли б вы мимо со своими «карингами». Использую и всё. В основном с map или sort.

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

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

Желязны рулез форэва!

They saw me take on my Aspect and wield an Attribute. They saw Mara do the same—here, in this monastery where we have revived the principle of ahimsa. They are aware that a god may do such things without karmic burden, but the shock was great and the impression vivid.

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

Шли б вы мимо со своими «карингами». Использую и всё. В основном с map или sort.

Cool!
Keep in going!

Эльфы Лучшие!
Приз главному юмористу!

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

Я не писал 20 лет на лиспе. Я 20 лет назад начал это делать. В основном для автокада. Года 3-4 наверно писал. Потом так, иногда ради прикола в емаксе или тупо в clisp. Текущим положением с реализациями лиспа не интересовался .

С какого перепугу я должен был узнать sbcl?

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

ну добавь. А мы посмотрим.

В С++ уже добавили - работает.

Ещё в лиспах и ML-ях это было уже давно, просто там не останавливались на малом - ФВП добавили, GC сделали, VM сделали, но при этом «утратили» системность и строгий контроль за ресурсами. «Утратили» потому что тут не всё так просто - VM таких языков по своим функциям часто сильно напоминают ядра ОС (менеджер памяти есть, может быть планировщик, менеджер IO, времени, STM и т.п.). Но вот если взять MLton (SML) или Stalin (Scheme), то можно увидеть и императивность, и функциональность, при этом для определённых подмножеств своих языков они генерируют код сопоставимый с кодом что генерирует gcc (а ещё там есть компиляция via C и FFI, что даёт некоторую свободу в выборе платформ).

Отправь в функцию ВЕСЬ контекст, только лично мне непонятно - нахрена? без всяких [=] я могу отправить в функцию нужный мне кусок контекста, зачем мне ещё что-то?

Разница в том, что настоящий capturing происходит и разрешается автоматически компилятором, то есть явно никакой контекст передавать не нужно, а вот ручная передача всех аргументов (а если их 20?) это скучно и можно чего-то напутать. Но вообще дело не в отдельных вложенных функциях и лямбдах, как я говорил, а в том, что когда у тебя ФП головного мозга^W^W в коде, тебе нужно много таких функциональных конструкций.

В чистом си у этого, конечно, мало применений, но можно, например, использовать nested функцию как некий (отсутствующий) нелинейный аналог for когда нужен не линейный обход, а рекурсивный и неохота таскать весь контекст основной функции во вспомогательную рекурсивную функцию.

Почему ты вдруг решил, что «код состоящий из комбинаторов, частичных применений, лямбд и секций чуть более, чем полностью» проще записи if(x>5)...?

Ты немного не понял. Я провожу такую параллель:

ассемблер                               ассемблер                               POD как они есть

тупое SSA                               тупые функции                           тупые записи / объединения

удобные вложенные выражения             удобные ФВП                             удобные вложенные данные и NPM

все части полезны и if(x>5)..., и то что ты процитировал, это просто разные вещи.

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

Я провожу такую параллель

И Си получает 3, 2 и 2.5 балла, соответственно.

quasimoto ★★★★
()
Последнее исправление: quasimoto (всего исправлений: 1)

Здесь всё ещё про ЯП? Ни нацпола, ни баб, ни тайн вселеннной? Тред прогнил. ЛОР не торт.

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

Ни нацпола, ни баб, ни тайн вселеннной? Тред прогнил. ЛОР не торт

Да ты гонишь, эльфы же!

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

Легко.

Долой киборгов

Деффки рулез

Знаете ли вы, что по большому счёту, топологически человек представляет из себя бублик?

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

вот что тред не в топ-10 — это странно, да

Так ни нацпола ни девок ни systemd ни убунты.
Никто читать не будет.

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

Характерная неряшливость мышления

Сказал человек, задающий вопросы вида «На ВАЗовской машине или на Калине?»

Так держать, бро.

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

и что? Ты же вроде не веруешь в Святого Патрега или в Святого Марка?

А что, только у тех, кто верует, компилятор матерится на неизвестные символы или позволяет использовать for вне функций?

почему «беспомощно», если я предоставил РАБОЧИЙ код?

Не на Си.

Факториал считается.

4.2.

ясное дело - не компилируется. А ты что хотел? Ну вот тебе вот так вот:

А, ну значит у неверующих тоже не компилируется. Ну слава святому Марку!

Ты зачем-то показал код на пхп, теперь показываешь код на bc. И только код на Си ты почему-то всё никак не можешь показать. Всё-таки ты о чем-то подозреваешь, наверное.

Напоминаю твой собственный вопрос: где код лаконичнее, на Си или лиспе? Чтоб на него ответить, надо показать код. Неожиданно, правда?

ещё вопросы?

Да. Когда покажешь код?

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

А ты? Ты думаешь,что строчки типа int main(void){ return 0; } что-то ВЫЧИСЛЯЮТ? Редкий образчик погромиста-ГСМ...

Пациент бредит и пытается задавать бессмысленные вопросы.

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

вообще-то этот «огрызок» вырезал из вполне рабочего кода

А, ну тогда вот это — вычисление факториала на лиспе: (apply #'*

Чего говоришь, скобочки не закрыты? Ну так это же вырезано из рабочего кода, чувааак! Всё остальное самоочевидно.

Только кроме этих двух строк ВСЁ остальное в нём и так очевидно

Настолько очевидно, что ты до сих пор не осилил это показать.

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

Значит, вопрос "(Написано) на семействе языков си или на конкретном представителе данного семейства?" является нормальным. Ок.

Ок. :D

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

Ты хочешь поговорить именно о C vs CL? так и скажи.

Эпично съехал с темы. Грац.

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

Блин, вот почему таких текстов и примеров нету в книжках про ФП? Всё ж просто и понятно становится.

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

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

в сишечке есть указатель на функцию, который вполне себе callable. Он замкнут на параметры функции, а в качестве параметра ты можешь использовать не только объект, но и указатель на объект, получая таким образом замыкание

Пациент впал в делирий.

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

Вы считаете, что в мире без C# было мало фп программистов?

Я считаю что без С# в мире бало бы мало людей использующих его (фп).

Мало для чего? В том то и дело, что все, кто хотел пользоваться, пользовались (фп).

Мало для дальнейшего развития.

Почему мало? Открою секрет, что фп развивается и очень неплохо. Это не массы людей влияют на развитие той же джавы/c# (ты наверное все-таки про это развитие), а развитие java/c# влияет на массы, да и то, судя по треду, не сильно и влияют.

В том то и дело, что все, кто хотел пользоваться, пользовались.

На лиспе? На хаскеле?
Я на Scheme ни одного проекта не сделал, кроме мелких служебных программок, так как ни библиотек ни поддержки ни комьюнити по разработке к примеру вэб приложений.

А в чем проблема разработки вэб приложений на схеме, common lisp-е, clojure?

Я очень рад что эти возможности появились в C# и я наконец могу их использовать а с появлением нормальных лямбд в Java смогу это делать ежедневно так как C#+Java ~= 90% моих проектов.

Можно сросить, а почему вы не можете использовать другие языки под jvm и .net, раз так вам нужны были эти возможности? Мазохизм какой-то?

Часть все-же при попытке доказать что к примеру их Java может не хуже изучают Scala(откуда по моему и содран синтаксис лямбда-linq в C#) и таких на форуме много. Сначала они издеваются над C# и linq потом пытаются доказать что Java как платформа не хуже потом изучают Scala и вуаля, человек начинает излечиваться от безмозглого фанатизма.

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

Они нужны не так часто, как фильтры так как в гибридном языке библиотеки все-же поддерживают в первую очередь OO

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

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

Про техники: На самом деле их _элементы_ были, например в том же пхп с хрензнам каких пор есть функции «array_[map, reduce, filter]», но пока в нем не сделали условно-нормальных лямбд, передать в них можно было либо именованную функцию, либо извращаться с crate_function, которая одним из аргументов принимала текст функции в виде _строки_(!) Метафора «дрочить вприсядку» тут будет иметь значение «легко и непринужденно».

Между тем, я одно время именно так (при помощи именованных функций и create_function; лямбд в то время в языке еще не было) и дрочил некоторое время. После чего понял, что пора лечиться и завязывать с пхп.

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

Это не массы людей влияют на развитие той же джавы/c# (ты наверное все-таки про это развитие), а развитие java/c# влияет на массы, да и то, судя по треду, не сильно и влияют.

Не согласен.

А в чем проблема разработки вэб приложений на схеме, common lisp-е, clojure?

Нет библиотек и программистов.
Нужна работа с вэб-сервисами, авторизация в ActiveDirectory, работа с БД и желательно не на уровне ODBC/JDBC а какой-то persistence layer.

Важно наличие персонала, который будет сопровождать, так как держать разработчика на поддержке-дорого.

Я не постоянный сотрудник, который печётся о job-security и поэтому старается забубенить так чтобы никто в его произведении не мог разобраться и его держали до пенсии на сапорте. Мне желательно чтобы мене предложили контракт в будущем.

Можно сросить, а почему вы не можете использовать другие языки под jvm и .net, раз так вам нужны были эти возможности? Мазохизм какой-то?

Нет персонала, который будет это сопровождать.
Кадры в параллельном тиме забубенили проект на Груви сугубо криво и теперь винят ЯП(хотя он и вправду не очень), так теперь когда я предложил Scala для небольшого проекта, это восприняли как очень остроумную шутку и хихикали пол часа :(

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

С# как раз и является примером популярного языка OO с удобной реализацией ФП в котром использование функционально стиля включено в библиотеки языка.
Скала не в счет. Изза мерзковатого синтаксиса и нелюбви Оракла она по моему так никогда и не достигнет даже на уровня Руби не говоря о Java,C#,C++

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