- 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, который честно может сгенерить одну функцию из двух.
j123123 19.03.2019 13:55 # 0
j123123 19.03.2019 13:59 # +3
Ой бля... как всё запущено. Лямбда это просто синтаксический сахар, не более того. От этого нихуя не меняется. Можно вместо лямбд писать всякий раз новую функцию и ее вызывать в нужном месте.
guest8 19.03.2019 20:23 # −999
j123123 20.03.2019 11:16 # +3
Ну и не стоит забывать про расширения GCC https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
MPA3b 20.03.2019 11:47 # +2
gost 20.03.2019 13:50 # +2
https://ideone.com/n8lmTk
Собственно, до 11-х крестов так и делали. Да и сейчас лямбды — это обычный синтаксический сахар именно над такой «структуркой с контекстом». Ничего нового и революционного они в кресты не принесли, как бы фанатики из обсуждаемой статьи не вопили об обратном.
gost 20.03.2019 14:02 # +3
https://ideone.com/dNcjds
Выходим из get_lambda(), x уничтожается, ссылка в лямбде протухает.
В языках с нормальными замыканиями такой херни не происходит, потому что замыкание увеличивает срок жизни захваченных объектов, а вот в крестах это не прокатит по причине отсутствия GC (хотя, конечно, можно заюзать std::shared_ptr/unique_ptr — опять вручную).
guest8 20.03.2019 18:38 # −999
j123123 19.03.2019 14:03 # +5
> Иван: Не уверен, что они учат Haskell именно по этой причине. Думаю, C++-разработчики просто очень эгоистичные. Они так хорошо изучили C++ только потому, что он сложный. И если ты хочешь выучить что-то действительно новое, твой путь лежит явно не в какую-нибудь Java, которая специально создана быть простой. Тебе нужно искать в области необычных и странных языков, самых странных, и Haskell автоматически окажется среди самых популярных ответов. Человек видит его, понимает: о, это что-то более сложное, чем C++, нужно выучить. Когда я изучал Haskell, со мной было то же самое, и у меня есть знакомые, которые прошли точно по такой же цепочке рассуждений.
Они так хорошо изучили C++ только потому, что он сложный.
https://govnokod.ru/25343#comment456602 :
> Хотя на самом деле это мастерство преодоление трудностей не нужно нормальному человеку, ибо здравомыслящий человек предпочитает избегать трудностей, а не героически преодолевать их, доказывая кому-то свою крутизну. Ну, это как если б кто-то жил в засранной квартире с кучей битого стекла и ржавых гвоздей торчащих из досок, и он поэтому научился ловко обходить битое слекло и гвозди, и потом среди таких же жителей засранных квартир он будет мегакрутым спецом. Но нормальный человек просто покрутит у виска и скажет, что навыки перепрыгивания через говно, гвозди и битое стекло нормальному человеку нахрен не нужны, и что он лучше будет жить в нормальной квартире, чем задрачивать навыки жизни в говне и потом выебываться этими навыками перед такими же долбоебами
bormand 19.03.2019 14:40 # +2
Т.е. это как с наркотой - травка уже не вставляет, надо что-то более сильное?
3.14159265 21.03.2019 20:12 # +1
Трава — это ecmaScipt 5. ES6 — китайские спайсы, от которых дуреет голова.
Кресты — это что-то опиатное. Сначала никому не нравится, потом вырабатывается жуткая зависимость.
And once you’ve gotten used to it, you start wondering why other don’t start smoking the same thing.
guest8 21.03.2019 20:42 # −999
guest8 21.03.2019 21:13 # −999
OCETuHCKuu_nemyx 21.03.2019 21:59 # 0
guest8 19.03.2019 15:44 # −999
TOPT 19.03.2019 15:48 # 0
TEH3OPHblu_nemyx 19.03.2019 17:55 # 0
Думаете, консоль вкуснее?
Наш гуй –— самый лучший изо всех, которые были.
Все умные люди пользуются нашим гуём!
Зато нашим гуём не смогут воспользоваться пиндосы!
Если не наш гуй, то что?
У вас бы на нашем месте тоже был бы невкусный гуй.
Не врите, наш гуй вкусный: двоюродной сестре третьей жены брата маминого внучатого племянника всё понравилось!
TEH3OPHblu_nemyx 19.03.2019 17:43 # +2
«C++» –— самый лучший ЯП изо всех, которые были.
«C++» –— единственный ЯП, за который не стыдно.
Если не «C++», то что?
«С++» –— мировой лидер среди ЯП.
Все умные люди пишут на «C++».
Язык «C++» поднял программирование на новый уровень.
«С++» напугал любителей абаков и логарифмических линеек.
Благодаря «С++», всё в ПО изменилось в лучшую сторону.
А какая основа «C++» после сишки досталась!
Думаете, легко изобретать стандарты для такого популярного ЯП, как «С++»?
Комитет не может уследить за всеми мелочами.
Дайте комитету ему время!
Комитету враги мешают.
Комитет отвечает только за синтаксис, за реализацию отвечают производители компиляторов, так что в багах компиляторов комитет не виноват.
В «BCPL» было хуже!
В любом ПО большая часть написана на «C++»!
Вы бы на месте Страуструпа тоже хуйни наворотили!
Не врите, в «C++» всё легко: у двоюродной сестры третьей жены брата маминого внучатого племянника всё получается!
Кто работал и не ленился, тот научился перепрыгивать через гвозди и через говно!
ПО на «C++» полно, кто хочет, тот справляется.
В «Malbolge» разве лучше?
Такие проблемы есть везде, а не только в «C++».
Надо работать, а не ныть!
Зато в «C++» нет программистов «по случаю»!
Кто ты такой, чтобы критиковать «С++»?
Начни с себя! Изобрети полезный ЯП!
Вы прогнулись под «Паскаль»/«Жабу»/«C#»/«PHP»!
За что ты так ненавидишь программирование?
Не нравится «C++» –— переходи на «PHP», никто не держит!
guest8 19.03.2019 17:47 # −999
TEH3OPHblu_nemyx 19.03.2019 17:48 # 0
guest8 19.03.2019 19:12 # −999
TOPT 19.03.2019 19:40 # 0
TEH3OPHblu_nemyx 19.03.2019 19:50 # 0
guest8 19.03.2019 20:09 # −999
guest8 19.03.2019 20:15 # −999
MPA3b 20.03.2019 12:10 # 0
guest8 20.03.2019 12:18 # −999
guest8 19.03.2019 20:09 # −999
3oJIoTou_xyu 20.03.2019 12:20 # 0
guest8 20.03.2019 12:45 # −999
3oJIoTou_xyu 20.03.2019 12:54 # 0
guest8 20.03.2019 13:29 # −999
3oJIoTou_xyu 20.03.2019 13:33 # +1
Или это такая жизненая переменная которая тупо булево? Я против булева!
А за lua и таблицы - разбиваю лицы.
MPA3b 20.03.2019 18:33 # +1
TEH3OPHblu_nemyx 20.03.2019 18:35 # +1
guest8 20.03.2019 18:37 # −999
TEH3OPHblu_nemyx 20.03.2019 18:40 # 0
MPA3b 20.03.2019 18:52 # 0
TEH3OPHblu_nemyx 20.03.2019 19:03 # 0
https://yandex.ru/images/search?text=бра+и+кет
guest8 20.03.2019 19:12 # −999
gost 19.03.2019 17:59 # 0
3.14159265 21.03.2019 19:58 # +1
Ахахаха.
Сказочные функциональщики!
Спасибо. Связь хачкеля и крестов confirmed.
bormand 19.03.2019 14:38 # +5
Если в сишке рассматривать пары из указателя на функцию и контекста, то такое подмножество сишки, внезапно, становится полноценным функциональным языком. Вот и вся магия.
3.14159265 21.03.2019 20:07 # +1
Угу. В «ооп» эту роль выполняет неявный this. Иногда под капотом он превращается в первый аргумент метода. Иногда (js) подчиняется своду из десятка правил.
И ещё непонятно чего от такой сахарной магии больше: пользы или вреда.
guest8 20.03.2019 14:16 # −999
cmepmop 27.03.2019 18:34 # 0
j123123 27.03.2019 01:23 # 0
Вообще, херня какая-то. Называть такую поебень функциональщиной это как сказать что у меня в туалете установлено биде, ведь когда большие куски дерьма падают в воду, брызги оттуда попадают мне на жопу.