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

Re: kylix 2



Evening, Vlad. 

Vlad Harchev <hvv@hippo.ru> 18:21 10/1/2003 wrote:

>> Нет. Совсем не аналогичный. Мы же не говорим о решении конкретной задачи, а
>> о демонстрации определенных принципов.
>>  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.

 VH>  На С++ - можно - используя шаблоны.

Можно попросить продемонстрировать?

>>  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));

 VH>  Да, это можно используя свойство языка С++ - шаблоны. 

Можно попросить продемонстрировать?

 VH>  А я вот хотел спросить - как делают структуры в лиспе (разных диалектах)? 
 VH> Или обходятся списками, и считают элементы с определенным индексом - членами?
Или списками, или соответствующими средствами для описания структур.

VH> А в Haskel/Erlang/Clean - также, или все-таки есть аналог структур С?

Там есть надмножество такого понятия, как структуры в С - называется
алгебраические типы (аналог из математики - прямая сумма декартовых
произведений). Пример:

data Filter = Filter { active::Bool
                     , conduit::String
                     , fOrder::Integer
                     , fName::String
                     } deriving Show

data Condition = Equals String String 
               | NotEqual String String
               | StartsWith String String 
               | Larger String String

Примеры значений этих типов: (Filter True "one" 1 "someName"), (Equals "A"
"B"), (Larger "123" "0123").

Еще примеры:

data Value = AsnOctString [Octet]
           | I Int
           | S { flags::[Octet], strBody::String } -- String with flags
           | D { parsedDate::String, rawDate::OctetStream } -- Date
           | T { parsedTime::String, rawTime::OctetStream } -- Time
             deriving (Eq,Ord)

data SR8Field = Prim Tag Value | Constr Tag [SR8Field] deriving (Eq,Ord)

Примеры значений: Prim (Tag ...) (I 123),
Prim (Tag ...) (AsnOctString [1,2,123]),
Constr (Tag ...) [ Prim (Tag ...) (S [9,8] "abc"), Prim (Tag ...) (T "12:24:23", [123,234,456]) ]

-- 
Dmitry Astapov //ADEpt                               E-mail: adept@umc.com.ua
GPG KeyID/fprint: F5D7639D/CA36 E6C4 815D 434D 0498  2B08 7867 4860 F5D7 639D



Reply to: