Это ответ на вопрос: как составлять функции в C, который перенаправлен сюда.
Вы можете создать структуру данных для реализации типа данных списка.
эта структура может содержать указатели на функции.
#include<stdlib.h>
#include<malloc.h>
typedef (*fun)();
typedef struct funList { fun car; struct funList *cdr;} *funList;
const funList nil = NULL;
int null(funList fs){ return nil==fs; }
fun car(funList fs)
{
if(!null(fs)) return fs->car;
else
{
fprintf(stderr,"error:can't car(nil) line:%d\n",__LINE__);
exit(1);
}
}
funList cdr(funList ls)
{ if(!null(ls)) return ls->cdr;
else
{
fprintf(stderr,"error:can't cdr(nil) line:%d\n",__LINE__);
exit(1);
}
}
funList cons(fun f, funList fs)
{ funList ls;
ls=(funList) malloc(sizeof(struct funList));
if(NULL==ls)
{
fprintf(stderr,"error:can't alloc mem for cons(...) line:%d\n",__LINE__);
exit(1);
}
ls->car=f;
ls->cdr=fs;
return ls;
}
мы можем написать функцию comp, которая применяет список функций:
type_2 comp(funList fs, type_1 x)
{
return (null(fs)) ? x : car(fs)(comp(cdr(fs),x));
}
Пример того, как это работает. Мы используем (f g h) как короткую запись для cons (f, cons (g, cons (h, nil))), которая применяется к данному аргументу x:
comp((f g h),x)
=
f(comp((g h),x))
=
f(g(comp((h),x)))
=
f(g(h(comp(nil,x))))
=
f(g(h(x)))
если вы использовали полиморфный тип списка в типизированном языке, таком как SML или Haskell, тип comp должен быть следующим:
comp :: ([a -> a],a) -> a
потому что в этом контексте все члены в списке имеют одинаковый тип.
С может быть более гибким в этом смысле. Может быть, что-то вроде
typedef void (*fun)();
или
typedef (*fun)();
вы должны увидеть, что руководство C говорит по этому поводу. И убедитесь, что все смежные функции имеют совместимые типы.
Составляемые функции должны быть чистыми, то есть без побочных эффектов и свободных переменных.