- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
/*
https://habr.com/ru/company/jugru/blog/444212/
Александр: Я не думаю, что существует какое-то одно «правильное» определение ФП,
но если говорить лично обо мне, то ФП — это нечто с функциональной композицией и
функциями первого класса.
Иван: Я согласен, но добавил бы ещё функции высшего порядка — те, которые могут
принимать другие функции в качестве аргументов и возвращать как результат.
Cергей: Ссылка на функцию в Си — считается?
Иван: Нет, Си не является функциональным языком программирования :-)
Сергей: Расскажи, почему?
Иван: Потому что нельзя из комбинации указателей на функции создать новую функцию,
можно только указывать на уже существующие. Конечно, если в ход не пошли какие-то
ассемблерные хаки.
*/
#include <stdio.h>
#include <inttypes.h>
#include <stddef.h>
#include <stdlib.h>
#include <errno.h>
#define FUNC(a, ...) typeof( a (*) (__VA_ARGS__) )
uint64_t mul2(uint64_t a)
{
return a*2;
}
uint64_t add2(uint64_t a)
{
return a+2;
}
uint64_t chaincaller(uint64_t a, typeof(uint64_t (*)(uint64_t)) *chain)
{
while(*chain != NULL)
{
a = (*chain)(a);
chain++;
}
return a;
}
FUNC(uint64_t, uint64_t) *combine_fn (FUNC(uint64_t, uint64_t) a, FUNC(uint64_t, uint64_t) b)
{
FUNC(uint64_t, uint64_t) *funchain = (FUNC(uint64_t, uint64_t) *)malloc(sizeof( FUNC(uint64_t, uint64_t) [3]) );
if (funchain == NULL)
{
exit(ENOMEM);
}
funchain[0] = a;
funchain[1] = b;
funchain[2] = NULL;
return funchain;
}
int main(void)
{
FUNC(uint64_t, uint64_t) *func_chain = combine_fn(mul2,add2);
uint64_t a = 15;
uint64_t b = chaincaller(a, func_chain);
printf("%" PRIu64 " * 2 + 2 = %" PRIu64 "\n", a,b);
free(func_chain);
return 0;
}
Ассемблерные хуяки.
https://wandbox.org/permlink/gdRggB77GQOiNzyJ
Он так говорит, будто б в крестоговно впилили какой-то недоJIT, который честно может сгенерить одну функцию из двух.
Ой бля... как всё запущено. Лямбда это просто синтаксический сахар, не более того. От этого нихуя не меняется. Можно вместо лямбд писать всякий раз новую функцию и ее вызывать в нужном месте.
Ну и не стоит забывать про расширения GCC https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
https://ideone.com/n8lmTk
Собственно, до 11-х крестов так и делали. Да и сейчас лямбды — это обычный синтаксический сахар именно над такой «структуркой с контекстом». Ничего нового и революционного они в кресты не принесли, как бы фанатики из обсуждаемой статьи не вопили об обратном.
https://ideone.com/dNcjds
Выходим из get_lambda(), x уничтожается, ссылка в лямбде протухает.
В языках с нормальными замыканиями такой херни не происходит, потому что замыкание увеличивает срок жизни захваченных объектов, а вот в крестах это не прокатит по причине отсутствия GC (хотя, конечно, можно заюзать std::shared_ptr/unique_ptr — опять вручную).
> Иван: Не уверен, что они учат Haskell именно по этой причине. Думаю, C++-разработчики просто очень эгоистичные. Они так хорошо изучили C++ только потому, что он сложный. И если ты хочешь выучить что-то действительно новое, твой путь лежит явно не в какую-нибудь Java, которая специально создана быть простой. Тебе нужно искать в области необычных и странных языков, самых странных, и Haskell автоматически окажется среди самых популярных ответов. Человек видит его, понимает: о, это что-то более сложное, чем C++, нужно выучить. Когда я изучал Haskell, со мной было то же самое, и у меня есть знакомые, которые прошли точно по такой же цепочке рассуждений.
Они так хорошо изучили C++ только потому, что он сложный.
https://govnokod.ru/25343#comment456602 :
> Хотя на самом деле это мастерство преодоление трудностей не нужно нормальному человеку, ибо здравомыслящий человек предпочитает избегать трудностей, а не героически преодолевать их, доказывая кому-то свою крутизну. Ну, это как если б кто-то жил в засранной квартире с кучей битого стекла и ржавых гвоздей торчащих из досок, и он поэтому научился ловко обходить битое слекло и гвозди, и потом среди таких же жителей засранных квартир он будет мегакрутым спецом. Но нормальный человек просто покрутит у виска и скажет, что навыки перепрыгивания через говно, гвозди и битое стекло нормальному человеку нахрен не нужны, и что он лучше будет жить в нормальной квартире, чем задрачивать навыки жизни в говне и потом выебываться этими навыками перед такими же долбоебами
Т.е. это как с наркотой - травка уже не вставляет, надо что-то более сильное?
Трава — это ecmaScipt 5. ES6 — китайские спайсы, от которых дуреет голова.
Кресты — это что-то опиатное. Сначала никому не нравится, потом вырабатывается жуткая зависимость.
And once you’ve gotten used to it, you start wondering why other don’t start smoking the same thing.
Думаете, консоль вкуснее?
Наш гуй –— самый лучший изо всех, которые были.
Все умные люди пользуются нашим гуём!
Зато нашим гуём не смогут воспользоваться пиндосы!
Если не наш гуй, то что?
У вас бы на нашем месте тоже был бы невкусный гуй.
Не врите, наш гуй вкусный: двоюродной сестре третьей жены брата маминого внучатого племянника всё понравилось!
«C++» –— самый лучший ЯП изо всех, которые были.
«C++» –— единственный ЯП, за который не стыдно.
Если не «C++», то что?
«С++» –— мировой лидер среди ЯП.
Все умные люди пишут на «C++».
Язык «C++» поднял программирование на новый уровень.
«С++» напугал любителей абаков и логарифмических линеек.
Благодаря «С++», всё в ПО изменилось в лучшую сторону.
А какая основа «C++» после сишки досталась!
Думаете, легко изобретать стандарты для такого популярного ЯП, как «С++»?
Комитет не может уследить за всеми мелочами.
Дайте комитету ему время!
Комитету враги мешают.
Комитет отвечает только за синтаксис, за реализацию отвечают производители компиляторов, так что в багах компиляторов комитет не виноват.
В «BCPL» было хуже!
В любом ПО большая часть написана на «C++»!
Вы бы на месте Страуструпа тоже хуйни наворотили!
Не врите, в «C++» всё легко: у двоюродной сестры третьей жены брата маминого внучатого племянника всё получается!
Кто работал и не ленился, тот научился перепрыгивать через гвозди и через говно!
ПО на «C++» полно, кто хочет, тот справляется.
В «Malbolge» разве лучше?
Такие проблемы есть везде, а не только в «C++».
Надо работать, а не ныть!
Зато в «C++» нет программистов «по случаю»!
Кто ты такой, чтобы критиковать «С++»?
Начни с себя! Изобрети полезный ЯП!
Вы прогнулись под «Паскаль»/«Жабу»/«C#»/«PHP»!
За что ты так ненавидишь программирование?
Не нравится «C++» –— переходи на «PHP», никто не держит!
Или это такая жизненая переменная которая тупо булево? Я против булева!
А за lua и таблицы - разбиваю лицы.
https://yandex.ru/images/search?text=бра+и+кет
Ахахаха.
Сказочные функциональщики!
Спасибо. Связь хачкеля и крестов confirmed.
Если в сишке рассматривать пары из указателя на функцию и контекста, то такое подмножество сишки, внезапно, становится полноценным функциональным языком. Вот и вся магия.
Угу. В «ооп» эту роль выполняет неявный this. Иногда под капотом он превращается в первый аргумент метода. Иногда (js) подчиняется своду из десятка правил.
И ещё непонятно чего от такой сахарной магии больше: пользы или вреда.
Вообще, херня какая-то. Называть такую поебень функциональщиной это как сказать что у меня в туалете установлено биде, ведь когда большие куски дерьма падают в воду, брызги оттуда попадают мне на жопу.