On Mon, Jan 13, 2003 at 11:21:25AM +0200, Dmitry Astapov wrote: > > Evening, Vlad. > > Vlad Harchev <[EMAIL PROTECTED]> 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