- 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, который честно может сгенерить одну функцию из двух.