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

Re: kylix 2



On Mon, Jan 13, 2003 at 11:21:25AM +0200, Dmitry Astapov wrote:
> 
> Evening, Vlad. 
> 
> Vlad Harchev <hvv@hippo.ru> 13:23 11/1/2003 wrote:
> 
> >>  VH>  Да, это можно используя свойство языка С++ - шаблоны. 
> >> Можно попросить продемонстрировать?
> 
>  VH>  Когда будут правильно написаны шаблоны, то использование будет иметь вид:
>  VH> //с string
>  VH>   printf("It works: %s!\n", (make_overriden_function(str_function2,
>  VH> 	string("blah"), string("bar"))) ("bar").c_str() );
> 
> При этом в качестве str_function2 я смогу использовать, например strstr, не
> так ли? :) Или мне сначала придется за-wrap-ить ее в объект? :)

 В данном конкретном примере strstr использовать вообще не удасться, так как
 она не принимает и не возвращает об[ект класса string (да и вообще у strstr
2 параметра!).

 Но любую ф-ию с прототипом
    string (*)(const string& )
 или
    string (*)( string& )
 или
    string (*)(string )

 можно передать без всяких врапперов.

>  VH>  Принцип реализации make_overriden_function и прочего:
> [skip]
>  VH> //вспомогательная шаблонная ф-ия чтобы не приходилось всегда вручную задавать
>  VH> //параметры шаблонов
>  VH> template<class F,class A,class R>
>  VH> overriden_function<F,A,R> make_overriden_function(F &f,const A& a, const R& r)
>  VH> {
>  VH>     return overriden_function<F,A,R>(f,a,r);
>  VH> }
> Да, придется. Особенно интересно, если реализация f написана не мной, для
> изменений недоступна и совсем ни разу не объект. Я хотел своим примером

 Она не обязана быть об[ектом - она может быть обычным указателем на С ф-ию.

> показать, как можно создать и вернуть сущность типа "функция". В твоем же
> примере возвращается нечто, ни разу не являющееся функцией. А syntactic
> sugar в виде перегруженного оператора "()" не делает, как не старайся,
> результат нормальной функцией.

 С точки зрения семантики - результат ничем не отличается от нормальной ф-ии.
 Ну разве что размер об[екта побольше чем размер указателя (но стандарт тоже 
вроде ничего о размере указателя на ф-тю не говорит). Ну и что с NULL
 ее не сравнишь (хотя нет, можно перегрузить оператор сравнения с (void*)).

> Конечно, я согласен - можно придумать свою систему шаблонов и "жить в ней",

 Ну она уже придумана - это STL - и обязана присутствовать в каждой системе
именующей себя компилятором языка С++.

> подтверждая утверждение о том, что любая достаточно сложная программма на
> C++ содержит половинчатую, глючную, не соответсвующую спецификациям
> реализацию лиспа :) Речь в начале треда, помимо прочего, шла еще и про
> объем кода и его читаемость/сопровождаемость.....

 Да, есть такой большой недостаток, но иногда альтернатив С++ просто нет.
 
> 
>  VH>  Я не хочу сказать что С++ лучше чем какие-либо языки, я просто хочу сказать,
>  VH> что в С++ это тоже возможно, но часто в более громоздкой форме.  К сожалению,
>  VH> не все об этих возможностях С++ знают.
> Именно, в гораздо более громоздой форме. Может и хорошо, что лишь немногие
> об этих возможностях знают, и их используют.
> 
> >> data Condition = Equals String String 
> >>                | NotEqual String String
> >>                | StartsWith String String 
> >>                | Larger String String
> 
>  VH>  Можно вопрос - а какая семантика у Condition? - отношение?
> В данной конкретной моей программе? Семантика простая: программа -
> компилятор/интерпретатор некоего языка XYZ, в котором отношения бывают четырех
> типов, указаных выше. Язык XYZ в качестве операндов отношений допускает
> только литералы. Тип Condition является представлением понятие "отношение".
> Семантика поведения понятия "отношение" тут никак не описана.
> 
> VH>  А что, поддержка отношений имеется на уровне языков?
> Не понял вопроса :(

 Я спрашивал - какой синтаксический смысл для интерпретатора языка на которм
написан этот интерпретатор  - являются лексемы "Equals", "StartsWith" и т.д. - 
стоковые константы, ссылки на ф-ии или что?
 
 Еще хотел спросить - в каком из функциональных языков (lisp, haskel, ocaml,
erlang, clean) возможно и с какими расходами можно реализовывать сложные 
структуры данных типа графов (множества вершин с множеством ребер соединяющих 
пары вершин)?

-- 
 Best regards,
  -Vlad



Reply to: