#include <stdio.h>
/**
* Это собственно реализация именованных параметров, пропускаем
*/
#define structer(name, param) typedef struct param name;
#define fname(f) f ## _func
#define sname(f) f ## _stru
#define function_(type, f, argname, param)\
structer(sname(f), param) type fname(f)(sname(f) argname)
#define bind(f, ...) fname(f)((sname(f)) {__VA_ARGS__})
/**
* Синтаксис
* function_(<return_type>, <function_name>, <arg_container_name>, {<arguments>})
* Объявляешь как обычную функцию, только теперь параметры в её теле
* попадут в структуру <arg_container_name>
*
* Пример ниже: длина вектора.
* Выглядит стрёмно, но зато потом можно, во-первых, забиндить параметры по умолчанию,
* а во-вторых, использовать с именованными аргументами (как в питоне)
*/
function_(double, vectorLength, in, {double x; double y; double z;}) {
return sqrt(in.
x*in.
x + in.
y*in.
y + in.
z*in.
z); }
/**
* Синтаксис
* #define <new_f_name>(...) bind(<function_name>, <default_values...>, __VA_ARGS__)
* <function_name> должна быть фукнцией, объявленной способом выше (через function_).
* <new_f_name> это уже реально используемая фукнция, только параметры ей передаются
* префиксированные точкой (как записаны <default_values> в примере ниже).
* В конце нужно обязательно дописывать __VA_ARGS__
*
* Пример: взяли vectorLength и переделали в vectorLengthZero, у которого
* аргументы по умолчанию равны нулю.
* Второй пример: аргументы по умолчанию делаем равными 3, 0 и 0.
*/
#define vectorLengthZero(...) bind(vectorLength, .x=0, .y=0, .z=0, __VA_ARGS__)
#define vectorLengthOne(...) bind(vectorLength, .x=3, .y=0, .z=0, __VA_ARGS__)
int main() {
printf("|(0,0,0)|: %f\n", vectorLengthZero
() ); printf("|(1,0,0)|: %f\n", vectorLengthZero
(.
x = 1) ); printf("|(0,1,0)|: %f\n", vectorLengthZero
(.
y = 1) ); printf("|(1,1,0)|: %f\n", vectorLengthZero
(.
y = 1, .
x = 1) ); printf("|(3,0,0)|: %f\n", vectorLengthOne
() ); printf("|(3,0,4)|: %f\n", vectorLengthOne
(.
z = 4) ); printf("|(12,3,4)|: %f\n", vectorLengthOne
(.
z = 4, .
y = 3, .
x = 12) ); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+IAoKLyoqCiAqINCt0YLQviDRgdC+0LHRgdGC0LLQtdC90L3QviDRgNC10LDQu9C40LfQsNGG0LjRjyDQuNC80LXQvdC+0LLQsNC90L3Ri9GFINC/0LDRgNCw0LzQtdGC0YDQvtCyLCDQv9GA0L7Qv9GD0YHQutCw0LXQvAogKi8KI2RlZmluZSBzdHJ1Y3RlcihuYW1lLCBwYXJhbSkgdHlwZWRlZiBzdHJ1Y3QgcGFyYW0gbmFtZTsKI2RlZmluZSBmbmFtZShmKSBmICMjIF9mdW5jCiNkZWZpbmUgc25hbWUoZikgZiAjIyBfc3RydQojZGVmaW5lIGZ1bmN0aW9uXyh0eXBlLCBmLCBhcmduYW1lLCBwYXJhbSlcCglzdHJ1Y3RlcihzbmFtZShmKSwgcGFyYW0pIHR5cGUgZm5hbWUoZikoc25hbWUoZikgYXJnbmFtZSkKI2RlZmluZSBiaW5kKGYsIC4uLikgZm5hbWUoZikoKHNuYW1lKGYpKSB7X19WQV9BUkdTX199KQoKCi8qKgogKiDQodC40L3RgtCw0LrRgdC40YEKICogZnVuY3Rpb25fKDxyZXR1cm5fdHlwZT4sIDxmdW5jdGlvbl9uYW1lPiwgPGFyZ19jb250YWluZXJfbmFtZT4sIHs8YXJndW1lbnRzPn0pCiAqINCe0LHRitGP0LLQu9GP0LXRiNGMINC60LDQuiDQvtCx0YvRh9C90YPRjiDRhNGD0L3QutGG0LjRjiwg0YLQvtC70YzQutC+INGC0LXQv9C10YDRjCDQv9Cw0YDQsNC80LXRgtGA0Ysg0LIg0LXRkSDRgtC10LvQtQogKiDQv9C+0L/QsNC00YPRgiDQsiDRgdGC0YDRg9C60YLRg9GA0YMgPGFyZ19jb250YWluZXJfbmFtZT4KICogCiAqINCf0YDQuNC80LXRgCDQvdC40LbQtTog0LTQu9C40L3QsCDQstC10LrRgtC+0YDQsC4KICog0JLRi9Cz0LvRj9C00LjRgiDRgdGC0YDRkdC80L3Qviwg0L3QviDQt9Cw0YLQviDQv9C+0YLQvtC8INC80L7QttC90L4sINCy0L4t0L/QtdGA0LLRi9GFLCDQt9Cw0LHQuNC90LTQuNGC0Ywg0L/QsNGA0LDQvNC10YLRgNGLINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLAogKiDQsCDQstC+LdCy0YLQvtGA0YvRhSwg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINGBINC40LzQtdC90L7QstCw0L3QvdGL0LzQuCDQsNGA0LPRg9C80LXQvdGC0LDQvNC4ICjQutCw0Log0LIg0L/QuNGC0L7QvdC1KQogKi8KZnVuY3Rpb25fKGRvdWJsZSwgdmVjdG9yTGVuZ3RoLCBpbiwge2RvdWJsZSB4OyBkb3VibGUgeTsgZG91YmxlIHo7fSkgewoJcmV0dXJuIHNxcnQoaW4ueCppbi54ICsgaW4ueSppbi55ICsgaW4ueippbi56KTsKfQoKLyoqCiAqINCh0LjQvdGC0LDQutGB0LjRgQogKiAjZGVmaW5lIDxuZXdfZl9uYW1lPiguLi4pIGJpbmQoPGZ1bmN0aW9uX25hbWU+LCA8ZGVmYXVsdF92YWx1ZXMuLi4+LCBfX1ZBX0FSR1NfXykKICogPGZ1bmN0aW9uX25hbWU+INC00L7Qu9C20L3QsCDQsdGL0YLRjCDRhNGD0LrQvdGG0LjQtdC5LCDQvtCx0YrRj9Cy0LvQtdC90L3QvtC5INGB0L/QvtGB0L7QsdC+0Lwg0LLRi9GI0LUgKNGH0LXRgNC10LcgZnVuY3Rpb25fKS4KICogPG5ld19mX25hbWU+INGN0YLQviDRg9C20LUg0YDQtdCw0LvRjNC90L4g0LjRgdC/0L7Qu9GM0LfRg9C10LzQsNGPINGE0YPQutC90YbQuNGPLCDRgtC+0LvRjNC60L4g0L/QsNGA0LDQvNC10YLRgNGLINC10Lkg0L/QtdGA0LXQtNCw0Y7RgtGB0Y8KICog0L/RgNC10YTQuNC60YHQuNGA0L7QstCw0L3QvdGL0LUg0YLQvtGH0LrQvtC5ICjQutCw0Log0LfQsNC/0LjRgdCw0L3RiyA8ZGVmYXVsdF92YWx1ZXM+INCyINC/0YDQuNC80LXRgNC1INC90LjQttC1KS4KICog0JIg0LrQvtC90YbQtSDQvdGD0LbQvdC+INC+0LHRj9C30LDRgtC10LvRjNC90L4g0LTQvtC/0LjRgdGL0LLQsNGC0YwgX19WQV9BUkdTX18KICogCiAqINCf0YDQuNC80LXRgDog0LLQt9GP0LvQuCB2ZWN0b3JMZW5ndGgg0Lgg0L/QtdGA0LXQtNC10LvQsNC70Lgg0LIgdmVjdG9yTGVuZ3RoWmVybywg0YMg0LrQvtGC0L7RgNC+0LPQvgogKiDQsNGA0LPRg9C80LXQvdGC0Ysg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4g0YDQsNCy0L3RiyDQvdGD0LvRji4KICog0JLRgtC+0YDQvtC5INC/0YDQuNC80LXRgDog0LDRgNCz0YPQvNC10L3RgtGLINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC00LXQu9Cw0LXQvCDRgNCw0LLQvdGL0LzQuCAzLCAwINC4IDAuCiAqLwojZGVmaW5lIHZlY3Rvckxlbmd0aFplcm8oLi4uKSBiaW5kKHZlY3Rvckxlbmd0aCwgLng9MCwgLnk9MCwgLno9MCwgIF9fVkFfQVJHU19fKQojZGVmaW5lIHZlY3Rvckxlbmd0aE9uZSguLi4pICBiaW5kKHZlY3Rvckxlbmd0aCwgLng9MywgLnk9MCwgLno9MCwgIF9fVkFfQVJHU19fKQoKaW50IG1haW4oKSB7IAogICAgcHJpbnRmKCJ8KDAsMCwwKXw6ICVmXG4iLCB2ZWN0b3JMZW5ndGhaZXJvKCkgKTsKICAgIHByaW50ZigifCgxLDAsMCl8OiAlZlxuIiwgdmVjdG9yTGVuZ3RoWmVybygueCA9IDEpICk7CiAgICBwcmludGYoInwoMCwxLDApfDogJWZcbiIsIHZlY3Rvckxlbmd0aFplcm8oLnkgPSAxKSApOwogICAgcHJpbnRmKCJ8KDEsMSwwKXw6ICVmXG4iLCB2ZWN0b3JMZW5ndGhaZXJvKC55ID0gMSwgLnggPSAxKSApOwogICAgcHJpbnRmKCJcbiIpOwogICAgcHJpbnRmKCJ8KDMsMCwwKXw6ICVmXG4iLCB2ZWN0b3JMZW5ndGhPbmUoKSApOwogICAgcHJpbnRmKCJ8KDMsMCw0KXw6ICVmXG4iLCB2ZWN0b3JMZW5ndGhPbmUoLnogPSA0KSApOwogICAgcHJpbnRmKCJ8KDEyLDMsNCl8OiAlZlxuIiwgdmVjdG9yTGVuZ3RoT25lKC56ID0gNCwgLnkgPSAzLCAueCA9IDEyKSApOwogICAgcmV0dXJuIDA7Cn0=