- 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
// https://habr.com/ru/post/466985/
// о каррировании в крестоговне
// По сути это каррирующее говно просто складывает куда-то хуйню, а потом целиком ее в функцию призывает.
// Ну т.е. на Си можно написать дрисню вида
int shit(int a, int b, int c, int d)
{
return a*(b+c*d);
}
// И вот каррирование такой дрисни это как если б я сделал структуру
struct shit_arguments
{
int a;
int b;
int c;
int d;
};
// И потом бы с конца заполнял это говно
struct shit_arguments;
shit_arguments.d = 13;
shit_arguments.c = 666;
shit_arguments.b = 1488;
shit_arguments.a = 42;
// и при полном заполнении этого говна просто б вызвал функцию
// подставив туда накопившееся говно
int somecrap = shit(shit_arguments.a, shit_arguments.b, shit_arguments.c, shit_arguments.d);
// именно так эта крестовая дрисня и работает, она не может произвести частичное вычисление
// не может сделать функцию с частично вычисленной дрисней в ней на основе частично переданной хуйни
// если я например в функцию shit захочу частично подставить аргументы b,c,d как 1,2,3 то у меня не получится функции вида
int shit_b1_c2_d3(int a)
{
return a*(7); // 1+2*3 = 7
}
// Нихуя подобного не будет. А если нихуя подобного нет, нахуй это бесполезное дерьмо вообще надо?
// В крестах никак нельзя на основе каких-то готовых функций сгенерить
// видоизмененные функции с частично сделанными вычислениями
// Никакой нормальной рефлексии нет, просто какие-то тупые кривые костыли к сишечке налепили
// И это программисты?
Именно поэтому я пишу
и радуюсь жизни
https://i.dailymail.co.uk/i/pix/2013/01/04/article-2257209-16C051F1000005DC-920_634x822.jpg
> Оптимизация программ на основе использования априорной информации о значении части переменных называется специализацией.
И возможно даже чтоб JIT можно было запилить с таким вот. Типа есть функция с кучей принимаемых аргументов, и чтоб на основе такой функции можно было сделать новую функцию с меньшим числом принимаемых аргументов, четко и дерзко захардкоживая часть значений, получая в итоге новую откомпилированную функцию, с уже частично сделанными вычислениями.
Если же эти аргументы известны только в рантайме, то всё плохо. Чтобы оптимизировать, нужно в рантайм встраивать оптимизирующий компилятор, значит, рантайм распухнет. Даже если плюнуть на оптимизацию, всё равно для взятия указателя на такую функцию с частично применёнными аргументами придётся строить трамплин. В «gcc» трамплины приводят к снятию защиты от исполнения кода в стеке.
Необязательно, возможны промежуточные решения. Например:
такую newshit можно сделать так
Ну и вот эту дрисню b_c_d = (b+c*d) можно посчитать в момент исполнения, на основе кода функции shit
и сгенерить все это говно исключительно в компилтайме
Но в крестопарашной дрисне такого нет
>> int newshit(int a, int b_c_d)
Не всегда можно сделать именно так. Т. е. не всегда функцию можно свести к функции именно двух переменных. Если, например, в той же формуле a*(b+c*d) известны a, c, d, а переменная b остаётся свободной, то получим int newshit(int b, int a, int c_d). Если же известны a, b, c, а переменная d остаётся свободной, то получим int neswhit(int d, int a_b, int a_c). В самом же общем случае все аргументы придётся передавать отдельно.
Не, ну естественно есть разные варианты
например, если у нас функция
И если мы специализируем по b, c, d, e то можно сделать так:
Смысл в том, что если в цикле такая частично специализированная функция вызывается много много раз, такое частичное вычисления по части известных аргументов лучше чем ничего. Можно и наинлайнить даже
j123123 же интересует каррирование в нединамических языках.
Уииииии
бляди
что такое F блядь?
сука именование одним символом чтобы быстрее компилилось или что?
---
Жаль что тот тред на sql.ru заблочили. Никто не знает, сохранился ли он где-нибудь?
Как знание какого-то паршивенького неконсистентного языка с запутанным синтаксисом делает человека хорошим программистом?
То ли дело
Именно поэтому я за S" Forth".
>> простыня из спецсимволов, реализующая простейшую хуйню с сомнительной надобностью
> Сейчас работаю в месте, где всё скорее так, и очень доволен.
Типа есть функция
и я такой
и оно туда всунуло хуйню которая та функция принимает, и будет как:
Типа есть у нас структура:
и есть функция
Можно ли сделать что-то типа
?
Перед тем, как пихать в стек, структуру придётся разуплотнить. Если она была упакована, её поля нужно разжать до размера, кратного машинному слову.
Правда я не уверен что тут нет UB
А биекция — это инъективная сюръекция.