LINUX.ORG.RU
ФорумTalks

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

 , ,


7

7

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

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

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

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

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

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

★★★★★

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

твоя задача не создать полезный код, а что-то доказать

это ваша задача, не надо ее перекладывать на меня

Читай код код Ritmik'а, там все есть.

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

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

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

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

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

это ваша задача, не надо ее перекладывать на меня

разве? зачем тогда ты что-то доказываешь, код постишь, бенчмарки?

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

А можно подробнее

По моему здесь это уже полетало:

http://lisp-univ-etc.blogspot.com/2011/11/clojure-complexity.html

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

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

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

я опять хочу тебя заигнориь ) изначальное условие задал DrBattyи там не было никаких списков- просто один факториал

Вопрос реюза возник позже как иллюстрация к этой задаче.

и вы провалили свою «иллюстрацию», т.к. родили кривой и медленный код с побочными и лишними действиями

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

разве? зачем тогда ты что-то доказываешь, код постишь, бенчмарки?

дык по просьбам одного трудящегося, а бенчмарк - это уже в ответ на откровенные придирки

wota ★★
()

Охренеть, 22-я страница срача из-за каких-то сраных лямбд! А что ж будет, если кто-нибудь расскажет Ельфам про data driving например?

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

кривой и медленный код
я тебе не верю

ты не видишь создание ненужного списка? или не видел, какой _реальный_ код написал твой собрат, что хоть отдаленно приблизится к С по скорости?

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

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

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

хоть отдаленно приблизится к С по скорости?

даже на моем говноатоме с четвертыми кедами твой код и код Ritmik'а, даже в варианте O(N^2) выполняется одинаково быстро, визуально разницы нет.

Кстати, ты так и не ответил на мой вопрос о причине выбора критерия оптимизации. Я весь внимание.

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

22-я страница срача из-за каких-то сраных лямбд!

Срач уже не о лямбдах.

А что ж будет, если кто-нибудь расскажет Ельфам про data driving например?

Щитоето? Впрочем, попробуй.

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

Однако не стоит утверждать, что clojure - это какойто новый ньюэйдж супер-пупер-замена-всем-лиспам лисп.

кто-то в здравом уме способен на такое? ну, ельфы не в счет.

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

кто-то в здравом уме способен на такое? ну, ельфы не в счет.

Многие здесь на Лоре, неразличающие разновидности лиспов.

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

Срач уже не о лямбдах.

ага, о бабах, танцполе и паранормальных явлениях. Впрочем, ельфы подходят.

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

даже на моем говноатоме с четвертыми кедами твой код и код Ritmik'а, даже в варианте O(N^2) выполняется одинаково быстро, визуально разницы нет.

на всякий случай уточну - какой именно код ты мерял?

Кстати, ты так и не ответил на мой вопрос о причине выбора критерия оптимизации. Я весь внимание.

потребление памяти + скорость работы - очевидные и понятные критерии для любой программы, работа через промежуточный список - fail для обоих критериев

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

например

Оно дает кучу ссылок на «data-divEN», а не «data drivING».

Срач уже не о лямбдах.

ага, о бабах, танцполе и паранормальных явлениях

Да какая-то невнятная фаллометрия о реюзе %)

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

Можешь раскрыть свою мысль? Если возможно, опираясь в критике на пункты http://clojure.org/lisps.

а вот и кложурщики поддтянулись защищать свою корову ;) ссылку уже привел, смотри выше.

Я честно пытался пересесть на ваше чудо, но не смог после CL.

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

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

N=5

потребление памяти + скорость работы - очевидные и понятные критерии для любой программы, работа через промежуточный список - fail для обоих критериев

Преждевременная оптимизация — безусловное зло. Знаком с такой доктриной? Впрочем, я уже раскрывал тему

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

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

а вот и кложурщики поддтянулись защищать свою корову ;) ссылку уже привел, смотри выше.

Эту ссылку я видел еще прошлой осенью, хотелось послушать _твои_ доводы, если они существуют. Основные отличия от других лиспов - http://clojure.org/lisps. Какие из перечисленных нововведений ты считаешь неудачными? Lisp-1 vs Lisp-2 можешь задекларировать как недостаток, но предлагаю не подымать на обсуждение, по остальным пунктам - пройдись вкратце.

а вот и кложурщики поддтянулись

Не смеши

Я честно пытался пересесть на ваше чудо
на ваше чудо

Штиио? o_O

но не смог после CL.
но не смог

Скажи прямо - не осилил ;-)

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

N=5

очень реальные данные, ты ставь N хотя бы в 4000000 - банальная картинка в ARGB всего-лишь 1000х1000 пикселей, сейчас обычные скриншоты с ретины в памяти весят гораздо больше

Преждевременная оптимизация — безусловное зло. Знаком с такой доктриной?

и вы это наглядно продемонстрировали ;) когда испортили на ровном месте ради «реюза» код, который реально помещается в одну строку, а я у себя код не оптимизировал - у меня просто сразу нет никаких списков, один цикл - и вот вам результат, и более того - мне не надо думать об оптимизациях, а вам - вполне вероятно придется, т.к. на списках код в >1000 раз медленнее

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

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

И да, я могу ошибаться.

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

Примерно Вашу мысль понял. *уворачиваясь от кирпичей* тогда XML,JSON можно считать вполне в рамках данной идеологии?

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

который реально помещается в одну строку,

нет никаких списков, один цикл

проблема в том, что реальный код не помещается в одну строку, не заканчивается одним циклом и наличие/отсутствие списка ничего не решает. Важно то, как быстро (читай — дешево) будет готов проект и как мало геморроя (читай — денег) он будет требовать в дальнейшем.

а вам - вполне вероятно придется, т.к. на списках код в >1000 раз медленнее

Да, это вероятно. Если в других местах не будет неустранимых задержек «в >1000 раз», но это маловероятно.

испортили на ровном месте ради «реюза» код

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

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

тогда XML,JSON можно считать вполне в рамках

эээ... не совсем. И мне категорически не нравятся эти аббревиатуры в данном контексте — они как бы символизируют нечто Особенное, хотя это не так. Форматы, и вообще соглашения могут быть любыми. А если в каком-то отдельном случае удалось применить эти особенности — в добрый путь.

и да, Особенности таки имеются, xml/xtl _можно_ применить таким образом, я считаю; аналогично и json.

и нет, это не взаимоисключающие параграфы.

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

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

проблема в том, что реальный код не помещается в одну строку,

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

Если в других местах не будет неустранимых задержек «в >1000 раз», но это маловероятно.

конечно, всякие офисы, редакторы изображений, парсеры, СУБД, браузеры и вебсеверы, DE, ну и пр. софт - все упираются в «неустранимые задержки» в виде I/O, например, только почему-то кто-то быстро работает, а кто-то - почему-то нет

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

не знаю, я ж говорю - меня и простой цикл устроил, и сразу быстро получилось, а там можно было оптимизировать - через bsearch, например

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

в реальном коде не выносят _каждую_ строку в отдельную функцию

_каждую_ — нет. Но то, как оно в примере — вполне нормально. Можно конечно придраться к

(defn min-n-size-fact [m]
  (count (min-n-fact m)))
, особенно имея в виду модификацию для передачи в нее замыкания (вместо min-n-fact), но надо учесть, что это пример, а в реальном коде там наверняка будут какие-то дополнительные манипуляции с данными.

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

*снисходительно улыбаясь* Вот поэтому-то, малыш, выносить надо цикл.

без подъебок, такая тактика позволяет в ряде случаев засунуть нужную логику сколь угодно глубоко (привет тактодрочерам!) в т.н. «основной цикл программы» БЕЗ УВЕЛИЧЕНИЯ СВЯЗАННОСТИ кода. Эта мысль настолько проста и очевидна, что впервые, емнип, была озвучена в этом треде только теперь.

не знаю, я ж говорю - меня и простой цикл устроил

оно и видно.

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

*снисходительно улыбаясь* Вот поэтому-то, малыш, выносить надо цикл.

*презрительно прищуриваясь* детка, посмотри на взрослый код, любой - от ядра LInux и PostgreSQL, Chrome, Apache и пр. - и перестань напыщенно нести ахинею

такая тактика позволяет в ряде случаев засунуть нужную логику сколь угодно глубоко

охотно верю

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

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

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

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

П.С. а теперь таки в игнор, ты мне больше не интересен

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

и до этого всякие лавсаны тут набегали

что, не помогло? За столько-то времени? Небось, хреново тебе, defmacro белковый?

игнор

пиздабол

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

В ембеддед Lisp используется и сейчас для кодогенерации в целевой язык - C, system verilog, прочие hdl. Но это ни разу не «массовое» применение, поэтому и не рассматривал + использование высокоуровневого яп весьма ограничено требованиям по скорости конкретной шилизяки.

По количеству единиц написуемого софта embedded никак не меньше всего остального, так что вполне массовое явление. В одном только автопроме прошивок для однокристалок делается ежегодно вряд-ли меньше чем выпускается софта для РС.

Использование лиспа для кодогенерации встречалось для FPGA, но это настолько девайсоспецифично (даже не вендорспецифично) сделано, что реюз этого toolchain для другого девайса невозможен практически. Уж не говоря о том, что это всё - через жопу.

Лисп чисто своей идеей замечательно подходит для деланья контроллеров. Программа на лиспе - список, который принимает на входе список и выдаёт тоже список. Очевидная же фишка - входы девайса это список, и выходы девайса тоже список. Пишем прогу на лиспе которая из одного списка делает другой согласно логике работы и мы в дамках. Но нету нихрена ни компиляторов лиспа под массовые однокристалки, ни, соответственно, библиотек для io. А велосипедить какой-нибудь «USB-стек для ATTiny» с нуля - никому не хочется.

И вообще - с нормальными яп для ембеддед в тыщу раз более беда, чем для прикладного программирования: старое, монструозное неюзабельное уг с трендовым систайл-ооп (накуя?) без просвета...

О да.

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

^long [^long res ^long i ^long n]

не так читабельно, как в примерах на публику ;)

Тебе не нравится указание типа перед параметром? Как же ты программируешь на си? Мазохизмом попахивает.

Даже так читабельнее, чем твои «на каждый чих по циклу» вариантами.

и не реюзабельно, нельзя использовать для вычисления произведения, например

(defn sum* ^long [^long res ^long i ^long n foldf]
  (if (< i n)
    (recur (foldf i res) (+ 1 i) n foldf)
    res))

(defn sum [n]
  (sum* 0 1 n +))

(defn prod [n]
  (sum* 1 1 n *))

Оять с твоей стороны газы в лужу. А у тебя была бы очередная копипаста с циклом? Даже жалко тебя становится с твоим быдлокодом.

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

Я показал, что ты пишешь код на простые примеры (и то не с первой попытки смог) методом копипаста

ты _ничего_не показал, все что ты смог - попросил добавить к одной строке кода еще три для создания функции, а потом ВНЕЗАПНО сказал, что у меня копипаста, т.к. эти три строки везде похожи, даже в банальном цикле (та самая строка кода) ты «нашел» копипасту в виде инкремента _разных_ переменных и клюевого слова for

Наоборот, у тебя все повторяется, кроме имен переменных, условия и накапливаемого выражения. Каркас абсолютно одинаков. Ты даже этого не можешь понять. Представляю, как у тебя выглядят большие проекты.

Главная задача программиста (инженера) это борьба со сложностью в больших задачах. В этой борьбе помогают высокоуровневые языки. А низкоуровневые языки могут быть только использованы для близких к железу задач.

расскажи авторам OS X - они посмеются

Ты не догоняешь? Перечитывай текст собеседника по 2 раза.
И да. Макось это ОС. ОС это система близкая к железу. Это тоже перечитай 2 раза. Не, лучше 3, а то опять в луже пойдут пузыри.

Ritmik
()
Ответ на: комментарий от wota
;; список элементов последовательности n! меньше числа m
(defn min-n-fact [m]
  (take-while (fn [fact] (< fact m)) (lazy-fact 1 1)))

;; сколько элементов последовательности n! меньше числа m
(defn min-n-size-fact [m]
  (count (min-n-fact m)))

и еще момент - это _кривое_ решение, не надо получать список с факториалами, чтоб всего-лишь узнать кол-во «n! меньше числа m», это лишние, побочные и абсолютно ненужные действия,

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

Вот у тебя в программе действительно для получения одного элемента вычисляется список факториалов «static int r[ MAX_F ];», который висит в памяти, пока приложение не выгрузят. Я слышал, что у сишников в крови экономить каждый байт. Получается, что и до системных языков дорвались быдлокодеры. Печально.

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

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

Если не сложно, поясни, какой функциональности нет и какие лиспофичи отсутствуют?

Единственный плюс clojure - куча жабобиблиотек, но и сдесь может лучше подойти ABCL, который активно пилится.

Мужики то и не знают
https://github.com/search?langOverride=&q=clojure&repo=&start_val...

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

Следует однако признать, что если все вертится вокруг жабоэкосистемы и нет предыдущего опыта работы с другими лиспами, то clojure, как первый (недо)лисп, покажется венцом творения, и можно на ней и продолжать творить.

Наоборот, если есть опыт того же CL, то по многим параметрам clojure будет как глоток свежего воздуха. Много крутых прогеров в clojure имеют большой опыт в лиспе и не только в нем.

Однако не стоит утверждать, что clojure - это какойто новый ньюэйдж супер-пупер-замена-всем-лиспам лисп.

Фраза «clojure - это какойто новый ньюэйдж супер-пупер-замена-всем-лиспам лисп.» принадлежит только тебе. Сам написал, сам ответил. Ну-ну.

Clojure создавался с учетом недостатков лиспов, особенно CL. Это уже о много говорит.

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

ага, о бабах, танцполе и паранормальных явлениях

Да какая-то невнятная фаллометрия о реюзе %)

Как бы «реюз» это один из фундаментальных способов борьбы со сложность.

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

Я честно пытался пересесть на ваше чудо, но не смог после CL.

Ключевое слово «не смог». Если серьезно, какие были причины?

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

Ну а геттер и сеттер-то для него создаются неявно (чтобы, например, указатель на него взять), или так и нужно плясать с обёртками, как в примере выше?

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

Семейства языков Си" не существует

Молодец, ты прозрел. Либо текст является корректным текстом на данном языке, либо нет.

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

Тебе не нравится указание типа перед параметром?

кто тебе сказал? наоборот, рад что ты тоже их умеешь исользовать

(sum* 0 1 n)

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

А у тебя была бы очередная копипаста с циклом?

для нахождения произведения 1..N? да - это более читабельно чем (sum* 1 1 n *))

Даже жалко тебя становится с твоим быдлокодом.

(defn sum* ^long [^long res ^long i ^long n foldf] (defn sum [n] (sum* 0 1 n +)) (defn prod [n] (sum* 1 1 n *))

и эти люди пишут про быдлокод, давая невнятные названия функциям

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

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

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

Вот у тебя в программе действительно для получения одного элемента вычисляется список факториалов «static int r[ MAX_F ];», который висит в памяти, пока приложение не выгрузят.

а у тебя жаба в памяти висит, я ж не придираюсь

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

экономят каждый байт там где надо реально экономить, если статичный массив на 120, например, байт сделает все вычисления в программе мгновенными и без аллокация памяти - это отличная оптимизация, которую ТЫ ЖЕ И ПОПРОСИЛ, когда придрался, что типа медленно работает

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

Наоборот, у тебя все повторяется, кроме имен переменных, условия и накапливаемого выражения. Каркас абсолютно одинаков.

гениально, это говорят про функцию из одной строки, это даже не цирк, это «Кащенко»

Mакось это ОС. ОС это система близкая к железу. Это тоже перечитай 2 раза. Не, лучше 3, а то опять в луже пойдут пузыри.

не надо свою тупость переносить на других, а посмотри на чем написано _прикладное_ ПО под OS X в большей своей части, просто погугли - Obj-C там, Xcode, все дела

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