[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: kylix 2



On Fri, Jan 10, 2003 at 12:41:17PM +0200, Dmitry Astapov wrote:
> 
> Evening, Andrei. 
> 
> Andrei Sosnin <demonsly@hot.ee> 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



Reply to: