On Fri, Jan 10, 2003 at 12:41:17PM +0200, Dmitry Astapov wrote: > > Evening, Andrei. > > Andrei Sosnin <[EMAIL PROTECTED]> 22:29 9/1/2003 wrote: > > >> Нет. В С нельзя создать и вернуть функцию как результат. Пример: > >> makeAdder x = map (+x) > >> makeAdder имеет тип: > >> forall a. (Num a) => a -> ([a] -> [a]) > [skip] > > >> другой пример: > >> overloadFunctionAtSpecificPoint function point value = > >> (\x -> if x == point then value else function(point)) > >> Ее тип: > >> forall t a. (Eq a) => (a -> t) -> a -> t -> (a -> t) > [skip] > > >> В c/c++ так сделать нельзя. > > AS> То есть, другими словами, Haskel позволяет перегружать функции таким > AS> вот странным (для человека, ранее кроме как с С, С++, Паскаль, Питон и > AS> пр. ни с чем больше не встречавшегося) образом. Сложно для понимания, > AS> по крайней мере сначала. > Нет. Идея тут не в том, что можно перегружать функции (просто у меня пример > такой получился). Идея в том, что можно создать и вернуть объект типа > "функция". > > AS> Аналогичный код на С: > Нет. Совсем не аналогичный. Мы же не говорим о решении конкретной задачи, а > о демонстрации определенных принципов. > AS> #include <stdio.h> > > AS> #define POINT_V 64 > AS> #define VALUE_V 129 > > AS> int function(int x, int (*what_to_do)(int pnt), int point, int value); > AS> int function2(int x); > > Вопросы: > 1)Что надо сделать, чтобы решение работало для произвольных функций a -> b, > а не только для функций int -> int? При этом, решение должно быть type > safe.
На С++ - можно - используя шаблоны. > AS> int main(int argc, char argv[]){ > > AS> printf("function2 does: VALUE_V + 365; VALUE is: 129\n"); > AS> printf("Function returned on x == POINT_V: %i\n", > AS> function(POINT_V, &function2, POINT_V, VALUE_V)); > AS> printf("Function returned on x != POINT_V: %i\n", > AS> function(POINT_V+34, &function2, POINT_V, VALUE_V)); > > 2)В моем примере, overloadFunctionAtSpecificPoint возвращает объект типа > "функция", который затем можно использовать везде, где можно использовать > обычную функцию. Как сделать такое в С? Чтобы было что-то вроде: > new_function = function(&function2, POINT_V, VALUE_V)); > printf("It works: %d!\n", new_function(5)); Да, это можно используя свойство языка С++ - шаблоны. .. А я вот хотел спросить - как делают структуры в лиспе (разных диалектах)? Или обходятся списками, и считают элементы с определенным индексом - членами? А в Haskel/Erlang/Clean - также, или все-таки есть аналог структур С? -- Best regards, -Vlad