LP>В частности, ФЯ были бы очень к месту в CAD-системах в качестве внутренних языков. На них, быть может, легче решать небольшие, локальные задачи. Но для крупной разработки промышленного уровня применение данного подхода оптимальным назвать нельзя.
Я бы все же ознакомился с вопросом, прежде, чем такое заявлять.
Haskell Lisp (хоть он и не является ФЯ, как таковым)
Ну и так далее. Часто бывает так, что об использовании таких языков открыто не заявляется, потому что использование таких языков является конкурентным преимуществом.
LP>Мое мнение, возможно, незначительно изменится после ознакомления хотя бы с одним из этих языков (до этого у меня не было реального опыта применения).
И Остап протянул Ухудшанскому лист, на котором было
написано: ТОРЖЕСТВЕННЫЙ КОМПЛЕКТ НЕЗАМЕНИМОЕ ПОСОБИЕ ДЛЯ СОЧИНЕНИЯ ЮБИЛЕЙНЫХ СТАТЕЙ, ТАБЕЛЬНЫХ ФЕЛЬЕТОНОВ, А ТАКЖЕ ПАРАДНЫХ СТИХОТВОРЕНИЙ. ОД И ТРОПАРЕЙ.
Здравствуйте, VladGalkin, Вы писали:
VG>А Вы не кащенит ли случаем?
Что то мне не очень нравятся подобные шутки, прямо попахивающие оскорблением. Просьба разделять несогласие с утверждениями автора и личность самого автора.
Здравствуйте, VladD2, Вы писали: VD>Хм. А goto почему проблем с CAS не вызывает?
Потому, что он работает только в пределах текущего метода. И стек сохраняется неизменным.
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
K>Ну... Как здесь уже говорили в Pascal или в C можно с помощью ссылок на функцию организовать higher-order function,
А можно продемонстрировать мне, как это будет работать на С или Pascal? Элементарную функцию, которая делает из любой двухаргументной функции одноаргументную, связывая второй параметр?
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Sinclair wrote: > K>Ну... Как здесь уже говорили в Pascal или в C можно с помощью ссылок > на функцию организовать higher-order function, > А можно продемонстрировать мне, как это будет работать на С или Pascal? > Элементарную функцию, которая делает из любой двухаргументной функции > одноаргументную, связывая второй параметр?
Вспомни bind_1st/bind_2nd из STL и представь ее на С. Только вот
выглядеть будет еще более жутко.
Cyberax,
>> K>Ну... Как здесь уже говорили в Pascal или в C можно с помощью ссылок >> на функцию организовать higher-order function, >> А можно продемонстрировать мне, как это будет работать на С или Pascal? >> Элементарную функцию, которая делает из любой двухаргументной функции >> одноаргументную, связывая второй параметр? C>Вспомни bind_1st/bind_2nd из STL и представь ее на С. Только вот C>выглядеть будет еще более жутко.
Здравствуйте, Cyberax, Вы писали: C>Вспомни bind_1st/bind_2nd из STL и представь ее на С.
Не могу. Потому как stl вроде бы использует функторы и шаблоны, а в С ни того ни другого нету.
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Sinclair wrote: > C>Вспомни bind_1st/bind_2nd из STL и представь ее на С. > Не могу. Потому как stl вроде бы использует функторы и шаблоны, а в С ни > того ни другого нету.
Функторы — элементарно:
struct Functor
{
int (*func)(int a, int b);
};
int add(int a, int b)
{
return a+b;
}
Functor * new_add_functor()
{
Functor *f=(Functor*)malloc(sizeof(Functor));
f->func=&add;
return f;
}
int reduce(List *lst, Functor *f)
{
int res=0;
while(lst!=null)
{
res=f->func(lst->data,res);
lst=lst->next;
}
return res;
}
//Суть понятна?
Точно так же делаем bind_1st/bind_2nd. Скорее всего потеряем возможность
generic-программирования, но может с помощью макросов можно будет
сделать что-то подобное.
Я такое где-то даже видел, но сейчас не вспомню где именно.
Здравствуйте, raskin, Вы писали:
R>А разве там можно её передать так, чтобы она ссылалась на переменные R>функции на шаг выше?
Вообще, можно.
procedure forall(l:IntList; procedure f(var i:integer));
begin
while l<>nil do begin f(l.head); l:=l.tail end;
end;
procedure foo;
var
a : Integer;
l:IntList;
procedure AddA (var i:integer);
begin
i:=i+a;
end;
begin
...
forall(l, AddA);
end;
Но заставить винапи поддерживать это,конечно, нельзя.
Трурль wrote: > R>А разве там можно её передать так, чтобы она ссылалась на переменные > R>функции на шаг выше? > > Вообще, можно. > > procedure forall(l:IntList; procedure f(var i:integer)); > begin > while l<>nil do begin f(l.head); l:=l.tail end; > end; > > procedure foo; > var > a : Integer; > l:IntList; > procedure AddA (var i:integer); > begin > i:=i+a; > end; > begin > ... > forall(l, AddA); > end;
Это не то, что я хотел, я имел в виду передать как возвращаемое
значение. Это я и сам умею. Передача WinAPI являлась выдачей значения
вовне дерева вызовов с корнем в носителе локальной функции, что именно
принимало функцию — не так важно/
Здравствуйте, Cyberax, Вы писали:
C>Sinclair wrote: >> C>Вспомни bind_1st/bind_2nd из STL и представь ее на С. >> Не могу. Потому как stl вроде бы использует функторы и шаблоны, а в С ни >> того ни другого нету. C>Функторы — элементарно: C>//Суть понятна?
Неа. Непонятна. Покажи мне какой-нибудь другой функтор, который можно передать в Reduce.
C>Точно так же делаем bind_1st/bind_2nd.
Пока не понимаю, как именно C>Скорее всего потеряем возможность generic-программирования, но может с помощью макросов можно будет сделать что-то подобное.
Пока что всё, что мы сделали — это усложненную передачу двухаргументной функции.
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Sinclair wrote: > C>Функторы — элементарно: > C>//Суть понятна? > Неа. Непонятна. Покажи мне какой-нибудь другой функтор, который можно > передать в Reduce.
struct EnhancedFunctor
{
struct Functor base; //Трюк с наследованиемint threshold;
};
int sumNumbersGreaterThan(Functor *self, int a, int b)
{
EnhancedFunctor *enh=(EnhancedFunctor*)self; //!!if (a>enh->threshold) return b;
return b+a;
}
//Наш конструктор
Functor * new_filtering_functor(int threshold)
{
EnhancedFunctor *f=(EnhancedFunctor*)malloc(sizeof(Functor));
f->base.func=&sumNumbersGreaterThan;
f->threshold=threshold;
return f;
}
//Немного модифицируем reduce:int reduce(List *lst, Functor *f)
{
int res=0;
while(lst!=null)
{
res=f->func(f, lst->data,res); //Добавим указатель 'this'
lst=lst->next;
}
return res;
}
...
Functor *filter=new_filtering_functor(11);
int res=reduce(some_list, filter);
Такой трюк с наследованием структур гарантировано будет работать по
Стандарту С. Собственно, он очень широко используется в GTK. Там,
кстати, я такие трюки и видел.
Показать еще пару аналогичных функуторов?
Если еще добавить базовый класс с тремя двумя указателями на функции
(QueryInterface, Release, Add), то можно построить аналог COMа.
> C>Точно так же делаем bind_1st/bind_2nd. > Пока не понимаю, как именно
Если честно, мне не хочется вспоминать синтаксис указателей на функции
из C, а то бы написал
G>Как быть, куда бежать ? Никакого внятного, корректного и более-менее универсального способа обработать такую ситуацию пока не придумано. G>Так что — такова се ля ва ! 8)
в 1 ситуации в данных дырка
во второй ситуации данные больше чем средние два раза, так как считаются два раза.
в итоге в среднем за год выходим на ноль погрешность.
Здравствуйте, Sinclair, Вы писали:
S>Потому, что он работает только в пределах текущего метода. И стек сохраняется неизменным.
А чем тогда отличается концевая рекурсия? Она же тоже работает исключительно в рамках одного метода? Не, можно конечно попробовать реализовать межметодную концевую рекурсию без инлайнинга, но это же отдельная задача. Ведь даже не решая ее сделать тупой переход в начало метода с изменением параметров вместо вызова — не проблема.
В Моно эта инструкция работает отлично.
Сдается мне все же, что это не более чем отговорка тех кто криво реализовал данную возможность.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.