LINUX.ORG.RU
ФорумTalks

Это ваше фп

 , , ,


0

3

Удивительно положительное чувство овладевает человеком, когда он узнает что-то по настоящему новое.

Оно ещё более положительно когда человек не только узнаёт а ещё и осознаёт то, что узнал.

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

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

Но эрланг - это фантастика. Как можно писать на языке с только лишь константными переменными? А как же циклы? А ооп? Ну ооп ладно уж, ада вон тоже без ооп и ничего, хороший язык. Но некое чувство непонятности, как же на нём писать остаётся. Как же без переменных то? Рекурсия? А ну эта, которая стек в сях переполняет со временем? Знаем, знаем. Значит тоже фигня и ничего особенного? Ан нет!

Вот значит прочитал я про tail recursion optimisation и призадумался. Попробовал представить, как это на сях сделать, но остановился, и это хорошо.

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

Лямбды - так, слегка. Удобно, коротко, но не впечатляет.

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

После того, как я это всё переварил в башке - мозг окончательно расплавлен. Но не скрою - в этом есть какое-то ощущение просветления.

И это епик вин, товарищи. Я определённо фанатею от этих штук, хотя и понимаю, что в ФП я в общем-то нуб.

Собственно вопрос такой: как после того, как твой мозг окончательно разломали продолжать писать на этом убогом с++? Как дальше жить и что дальше делать? Пытаться ли писать на с++ в ФП стиле? Но это же издевательство надо коллегами, никто из них же ничего не поймёт. А главное бонусов же за это реально не будет ни с т.з. производительности, ни с т.з. количества кода. Или я ошибаюсь? Может кто-то поделится историей успеха?

Спасибо.

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

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

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

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

Это я все к тому тут говорю, что в программу на крестах очень просто добавить всяких динамических примочек из более «развитых» языков, а при желании и статических - кодогенерацию пока еще не отменили. С чего-то все тут вдруг решили, что если компилятор крестов чего-то не поддерживает из коробки естественным способом, то всё - если это прикрутить, то это будут уже не кресты. Я удивляюсь, что когда используют в крестах динамические списки или деревья, то не кричат - ололо, это уже не кресты, а когда предлагаешь сделать на этих списках, например, динамические объекты как в clos, или прикрутить кодогенерацию, чуть более продвинутую чем в cpp, то сразу начинаются возражения - это уже не кресты, это костыльно и т.п.

no-such-file ★★★★★
()
Ответ на: комментарий от Miguel

Хм, а что за случай? Так, для общего образования.

подсказка: ты этот случай тоже знаешь

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

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от no-such-file

И вопрос вот в чем: считать ли интерпретатор написанный на крестах имеющим отношение к крестам?

нет, не считать.

и программа частично написана не нем, а частично на крестах, то на чем написана вся программа?

И на крестах И на форте

только обычно никто так не делает

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

так, чтобы они стали ключевыми конструкциями языка?

есть такой старый боянный анкедот

Заходит программист на жаве в столовку и просит: дайте мне, пожалуйста, статик файнал Борщ борщ нью Борщ!

в жаве тоже можно писать ФП, но получится куча слов ниочем. Вот, например, Google Guava - куча слов ниочем.

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

возьмешь исходник GCC и добавишь новые конструкции? Новый синтаксис?

или прикрутить кодогенерацию, чуть более продвинутую чем в cpp

которую не поймет ни один кодоанализатор (и, соответственно, ни один дебаггер, ни одна IDE, итп)

так что придется написать еще свой анализатор, свой дебаггер, свою IDE

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

печально все это

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

ТС тут нафиг ни при чём. Иногда в общении надо этот самый value-binding объяснить собеседнику незнакомому ни с чем кроме императивщины. Теперь у меня есть достаточно краткая и понятная фраза в лексиконе.

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

ТС тут нафиг ни при чём

Я отвечал ТС по поводу фразы, которую сказал ТС. А вот другие контексты здесь и правда нафиг не причем.

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

так, чтобы они стали ключевыми конструкциями языка?

возьмешь исходник GCC и добавишь новые конструкции? Новый синтаксис?

Да что ж вы так привязались-то к синтаксису и ключевым словам. Если в лиспе определить новый макрос - он даст новый синтаксис? Кресты далеко не такой пластичный язык конечно, но и не совсем уж деревянный. А так, я вам пример уже привел, для динамических списков никакого синтаксиса и ключевых слов в крестах тоже нет, и что? Если на этих списках замутить объектную систему на прототипах и писать программу с ее помощью? А если дополнить это дело всем необходимым рантаймом, чтобы получился яваскрипт, например, но не делать repl и интерпретатор яваскрипта, а писать с помощью вызова соотвествующих функций рантайма как плюсовых функций/методов? Это какой язык?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Вполне возможно...

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

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

подсказка: ты этот случай тоже знаешь

Возможно. Тем более подскажи.

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

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

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

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

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

Это, разумеется, неверно. Точнее, верно только если проект пишется одним человеком за время, не превышающее двух недель.

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

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

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

«обработка мультимедиа, например» - это не «все».

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

Надо бросать эту жабку и идти работать скала-прогером, чувствую :)

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

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

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

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

no-such-file ★★★★★
()
Ответ на: комментарий от BattleCoder

вот то, что в питоне нет инкапсуляции, нет нормальных констант и неизменяемых объектов

С инкапсуляцией все ok, константы ненужны, без изменяемых типов типов (объекты-то тут причем?) прожить можно. А вот без tco нет.

неужели так сложно это реализовать на уровне интерпретатора?

Это не соответствует концепции языка, как сказал наш BDFL.

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

Потом переписываешь на плюсах, или на чистом C, уже убедившись, что всё работает.

И смысл? Читать оптимизированный С-код уже неинтересно, он не декларативен + переключение контекста. Если бы haskell (или другой фп-яп) позволял писать *высокопроизводительный* высокоуровневый императивный код или еще лучше - умел бы с помощью каких-то деклараций и небольших уступок оптимизировать код декларативный - было бы интересно, а так напрототипизировать математических формул, чтоб потом все переписать на другом яп - это нужно два программиста: один математик, другой чисто кодер-транслятор, на грани заменимости в машинный.

alienclaster ★★★
()
Ответ на: комментарий от no-such-file

Если в лиспе определить новый макрос - он даст новый синтаксис?

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

А так
Если
А если
например

В крестах это - через гланды, поэтому одни если и остаются.

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

Но рано или поздно все упираются в производительность систем.

Очень поздно, когда это уже особо никого и нии^W не тревожит.

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

т.е. как такового синтаксиса в лиспе нет.

Отпусти меня чудо-трава. В лиспе нет правил записи выражений? Любое выражение в скобочках - корректная форма для лиспа?

В крестах это - через гланды, поэтому одни если и остаются.

Для вас все, что сложнее хеловорда - костыли и через гланды, как я посмотрю.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

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

В лиспе нет правил записи выражений?

Ты блондинко? Правила записи выражений есть, но даже они синтаксически просты: открывающая скобка, функция/макрос/спецоп, аргументы, закрывающая скобка. Все. При этом не каждая открывающая-закрывающая скобка с неким содержанием внутри - выражение. И трактуется от контекста. О существовании синтаксиса на таком минимальном уровне можно в равной степени корректности сказать, как и о его отсутствии, потому как нам все равно, каким-то образом необходимо было бы _записывать_ язык, даже полностью состоящий из семантики. Если до тебя это туго доходит - можешь считать синтаксис лиспа сверх-минималистичным. Именно это его свойство (наряду с другими типа гомоиконности, наличия макросистемы...) позволяет меньше думать о том, как писать макросы, чтобы не прищемить при этом себе яйца.

В крестах это - через гланды, поэтому одни если и остаются.

Для вас все, что сложнее хеловорда - костыли и через гланды, как я посмотрю.

Объективно - в крестах этим никто не пользуется, поэтому, скорее - для вас.

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

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

Значит синтаксис все-таки в лиспе есть, а ты балабол.

Объективно - в крестах этим никто не пользуется, поэтому, скорее - для вас.

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

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

Значит синтаксис все-таки в лиспе есть

Перечитай мое первое сообщение на эту тему, дорогой дислексик: «синтаксис - условен». А ты тупая барашка, хо-хо-хо.

При написании хеловордов - никто

Никто не пользуется макросами, замыканиями, полноценными лямбдами? А кто спорит, для хелловорлдов в плюсах все ok (и то корявенько и многословно).

что еще раз показывает твой уровень знаний.

Не льсти себе, вряд ли ты способен оценить хоть чей-нибудь уровень знаний, вообще :)

alienclaster ★★★
()
Ответ на: комментарий от no-such-file

У вашего бота пластинку заело.

Ну дык если с первого раза до вас не дошло — приходится повторить.

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

И смысл?

Смысл чего? Прототипирования на Haskell? Удобнее писать, надёжнее получается. Переписывания на C? Если можешь, не переписывай.

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

Смысл чего? Прототипирования на Haskell?

Смысл писать на таком типобезопасном DSL, который все равно придется переписывать на сишечке без каких-либо высокоуровневых гарантий и через гланды. При этом отсутствует удобная система кодогенерации (макросы) минимальных единиц трансляции в потенциально любой язык. Т.е., выходит haskell - это такой DSL (кто б сомневался) для весьма ограниченного круга задач.

Переписывания на C? Если можешь, не переписывай.

Хотим ооп - haskell в пролете, нужна высокоуровневая математика и числодробильня - тоже (тут python и CL его вытесняют на ура), низкоуровневая числодробильная - С и фортран. Ниша хаскеля - прототипирование математических формул?

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

Этот идиотизм с подчёркиваниями - «всё ок» с инкапсуляцией? Я думаю, мы с вами ни о чём не договоримся.

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

При этом отсутствует удобная система кодогенерации (макросы) минимальных единиц трансляции в потенциально любой язык.

Ну почему, эта вполне удобная.

CL

Какая может быть числодробильня без инфиксных операторов? Ни разу не видел числодробилки на лиспе. Да и программы вообще, кроме emacs и maxima.

Ниша хаскеля - прототипирование математических формул?

Числодробильня — это не только формулы, но и иногда много логики. Последнее прототипируется очень успешно.

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

«синтаксис - условен».

Синтаксис в лиспе есть и он безусловен. Так же как и в любом языке программирования.

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

Я ничего не оцениваю, ты сам прекрасно показал, что ты балабол.

no-such-file ★★★★★
()
Ответ на: комментарий от alienclaster

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

Переписывать на другом языке - в разы проще, чем писать на нём сразу.

удобная система кодогенерации

/0

Ниша хаскеля - прототипирование математических формул?

Ну, я сейчас на нём вебню пишу. Это математические формулы?

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

Ну, я сейчас на нём вебню пишу. Это математические формулы?

Нет. Какой фреймворк, кстати, почему выбрал? Давно хотел посмотреть на хаскеле именно вебню.

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

Весьма тенденциозное заявление. Лучше продемонстрировал бы пример условности синтаксиса лиспа, чем свое пустословие.

no-such-file ★★★★★
()
Ответ на: комментарий от Miguel

Попробуй аргументировать, для разнообразия.

Что аргументировать? Я свое мнение уже высказал, а вы свое. Ваше утверждение, что проект на крестах с использованием ФП будет успешно сделан только если его будет писать один человек и не дольше двух недель я считаю чепухой взятой с потолка. Если у вас есть какой-то опыт, возможно печальный, в этом деле, будет интересно его услышать.

no-such-file ★★★★★
()
Ответ на: комментарий от Miguel

и сразу поймёшь, как МНОГО в лиспе синтаксиса и как он маскируется за скобочками

Или это сарказм, или не ко мне...

Я не говорю что в лиспе много синтаксиса, что он сложный и т.п., но тем не менее он есть и вполне конкретный.

no-such-file ★★★★★
()
Ответ на: комментарий от Miguel

Happstack. Простенький, удобный. Не сношает мозги TemplateHaskell-ом.

Как общение с бд происходит, orm есть? Чем happstack лучше популярного в свое время есода? Какие преимущества хапстека перед рельсами?

alienclaster ★★★
()
Ответ на: комментарий от no-such-file

Что аргументировать?

Что «чепуха».

проект на крестах с использованием ФП

Где я это сказал, интересно? Моё утверждение было существенно более частным: «Из крестов ... сделать маленький эрланг»

взятой с потолка.

Я свой аргумент привёл: Это ваше фп (комментарий)

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

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

Как общение с бд происходит

Понятия не имею. Вебня - это не только БД.

Чем happstack лучше популярного в свое время есода?

Как минимум, тем, что Yesod написан не пойми на чём. Толстенные макропрослойки во все края.

Какие преимущества хапстека перед рельсами?

Как минимум - Haskell

Miguel ★★★★★
()

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

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

Как общение с бд происходит

Понятия не имею. Вебня - это не только БД.

В вашей вебне не используется бд? И что это за вебня такая?

Какие преимущества хапстека перед рельсами?

Как минимум - Haskell

Это не (доказанное) преимущество. Хорошая технология, методологи разработки - да. Так есть что-то такое, что отличает в лучшую сторону Happstack от существующих аналогов (рельса, жанга)? Haskell и статическая типизация - это не преимущество, а особенность.

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