LINUX.ORG.RU
ФорумTalks

лямбды в новых язычках - PR или реальные полезняшки?

 , ,


7

7

Народ, а поясните пожалуйста, что конкретно имеется ввиду, когда некто, описывая всякие плюшки новорожденного языка восторженно заявляет «там есть лямбды!».

Ну что есть lambda в каком-нибудь lisp я представляю и даже понимаю зачем оно и как им пользоваться. В lisp'е. А что имеется ввиду под «лямбдой» например, в C#?

Хотелось бы увидеть не только цитаты из википедии, а простенькие примеры того, как эта лямбда сильно упрощает жизнь, удобство даёт и всё такое. В виде примера кода, разумеется, с пояснениями почему тут именно лямбда крута и без неё некузяво.

Только чтобы это не было аналогом перлового однострочника типа

perl -e 'print sub{ $_[0] + $_[1]; }->(1,2)."\n";'
ибо в этом никаких новшеств и преимуществ нету.

Просто сдаётся мне что «лямбда» в нынешних сишарпах это пиарное название допотопных безымянных функций которые даже в перле есть и никаких новшеств в этом на самом деле нету.

★★★★★
Ответ на: комментарий от quasimoto

Код всё равно использует данные. Вот есть функция F, в её коде используются переданные ей аргументы, если мы позволим возвращать из этой функции F другие локальные (определённые _внутри_ её тела) функции G_i, то они должны неизменно утаскивать с собой свой контекст вычисления

про то и речь, что в сишечке НЕЛЬЗЯ утаскивать внутренний контекст из функций. Причём это касается не только вложенных функций, но и вложенных переменных. Можно только сделать КОПИЮ или вернуть УКАЗАТЕЛЬ. Но указатель будет невалидным при выходе из функции. За то в сишечке можно передать в функцию контекст. Причём не обязательно глобальный. Так тебе шашечки или ехать?

Проблемы тут могут быть не в самих ФВП, а в мутабельности как таковой. Сами ФВП позволяют делать итераторы, декларативный функциональный pipelining и прочие полезные вещи.

проблема только в том, что итераторы в сишечке не сильно-то и нужны, есть ведь циклы. На самом деле очень мало задач, которые требуют передачу функций куда-либо.

Я думаю, написать эксплоит к old school style сишной программе гораздо проще

зря ты так думаешь. на самом деле, всё зависит от того, есть-ли ошибки приводящие к UB (в C). Если есть, то да, написать эксплоит проще. И найти такие места проще. А знаешь почему? Потому-что в ИП UB это баг, а в ФП - фича. Фишка в том, что в ИП можно и нужно это UB убрать, и это совсем не сложно(потому-что мало мест, где это UB _может_ вылезти). А вот в ФП это в принципе невозможно, ибо всё что угодно может и выполняться. Ну а VM помогают слабо - мало где нужна VMбез доступа к ФС, а с доступом смысла в VM никакого и нет.

drBatty ★★
()
Ответ на: комментарий от wota

Я получил от тебя код. Оценил его, как не реюзабельный

когда кончаются все придирки - остается только одно: пороть чушь без всяких аргументов и обоснований

Я привел пример реализации с возможностью реюза. Пример реюза тоже привел. Ты привел реализацию без возможности реюза. Я тебе на это указал, в ответ получил обвинения в придирках и чуши. Видимо аргументы закончились и пора переходить на личности.

Ritmik
()
Ответ на: комментарий от Ritmik

Ты привел реализацию без возможности реюза.

int fact_count( int m ) {
    int c=0;
    for( ; fact(c+1)<m ; ++c );  <---- РЕЮЗ ТУТ, СМОТРЕТЬ ВНИМАТЕЛЬНО
    return c;
}
wota ★★
()
Ответ на: комментарий от Stanson

Знаете ли, вызов и возврат из функции может выливаться в десятки команд процессора.

это мелочь. Куда как хуже, что код типа for(j=0;j<10;j++)x = y+z; компилятор с лёгкостью оптимизирует, ибо видит инвариантное выражение, и выносит его из цикла, а вот код for(j=0;j<10;j++)x=foo(y,z); оптимизировать будет ЗНАЧИТЕЛЬНО сложнее, ОСОБЕННО если foo формируется где-то в рантайме.

drBatty ★★
()
Ответ на: комментарий от drBatty

Вопрос нужны-ли они?

Пусть бы было. То что функция сможет вернуть новую функцию в куче не страшнее возвращения новых данных malloc, всё равно можно руками почистить _точно так же_. Но язык бы стал выразительнее.

Пример выше я уже приводил - если мне нужно вернуть функцию, я возвращаю указатель на функцию

На глобальную функцию. А не на локальную и замыкающую функцию рядом или сразу анонимную. Нет, ну вот данные могут быть вложенными и этим просто пользуются потому что есть. А функции не могут, могли бы - просто бы использовали и не спрашивали «зачем» и «чем удобно» (потому что это надо как раз использовать, чтобы понять чем). В C++ это решается ООПно в виде локальных классов, и ФПно лямбдами, но всё ещё без обычных вложенных функций.

Требование, что-бы код лежал обязательно на стеке, и туда копировался каждый раз, мне кажется избыточным.

Такого требования нет.

Сишечка в этом плане намного гибче, ибо данные я могу помещать там, где это мне нужно, а не там, где захочется компилятору.

Разумеется, сишечка гибче в плане ручного управления памятью, потому что ФП by design хочет и предполагает автоматическое управление.

вот чем тебе это не нравится?

А что это вообще такое? Ничего не демонстрирует, я могу заменить всё на 144 :)

quasimoto ★★★★
()
Ответ на: комментарий от geekless

У вас там довольно бессмысленный код, который демонстрирует обычное замыкание. Какие фильтры вы желаете в нём разглядеть?

Ну он писал что все что есть в C# это фильтры

grim ★★☆☆
()
Ответ на: комментарий от drBatty

это мелочь.

Смотря в какой ситуации. Если функция - это, например, какой-нибудь генератор градиента для графики, и вызывается на каждый пиксель, то лишние полсотни тактов при каждом вызове это фэйл. Вот тут, кстати, и могли пригодится лямбды которые возвращают натурально выполняемый код.

Или, например, это код для небыстрой однокристалки, под какую-нибудь задачу где каждый такт на счету.

ОСОБЕННО если foo формируется где-то в рантайме.

В этом случае оно вообще не сможет соптимизироваться, да.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от drBatty

Если русский родной, то именно на нём ты ДУМАЕШЬ.

Враньё.
Если знаешь язык то можешь думать на нём.
Невозможно построить осмысленную беседу на этом языке, постоянно переводя с другого.

А для программиста хорошо знать английский важнее чем русский.

grim ★★☆☆
()
Ответ на: комментарий от Stanson

Нет, пример на C# должен был быть аналогом лисповского

Вы хоть читайте, на что отвечаете.
А то как всегда у вас получается смешно.

grim ★★☆☆
()
Ответ на: комментарий от drBatty

Так тебе шашечки или ехать?

Мне, пожалуйста, си-подобный ML заточенный на ручное управление памятью и системное программирование, с хорошей реализацией и активным сообществом. Пригодится в хозяйстве :)

А что значит «UB в ФП - фича»? Где в OCaml или Haskell UB-фичи?

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Мне, пожалуйста, си-подобный ML заточенный на ручное управление памятью и системное программировани

Rust.

с хорошей реализацией и активным сообществом

Есть надежда.

tailgunner ★★★★★
()
Ответ на: комментарий от wota


Ты привел реализацию без возможности реюза.
int fact_count( int m ) {
int c=0;
for( ; fact(c+1)<m ; ++c ); <---- РЕЮЗ ТУТ, СМОТРЕТЬ ВНИМАТЕЛЬНО
return c;
}



Повторение - мать заикания. Приведи весь код этой и хотя бы пары функций из моих примеров, тогда посмотрим реюз кода между ними.

Ritmik
()
Ответ на: комментарий от grim

У вас там довольно бессмысленный код, который демонстрирует обычное замыкание. Какие фильтры вы желаете в нём разглядеть?

Ну он писал что все что есть в C# это фильтры

Вот пост лямбды в новых язычках - PR или реальные полезняшки? (комментарий). Найди там «все что есть в C# это фильтры».

Ritmik
()
Ответ на: комментарий от drBatty

Тогда давай уж я на пхп перейду?

Да ты неплохо устроился! Обсуждаем пхп — ты срешь «сишечкой», дали лиспокод — «перейду на пхп». Фокусник прям!

этот говнокод можно и в две строчки записать... Но так оно ИМХО лучше читается.

Глазами эльфа, да. А вложенный цикл — вообще пушка, не забудь упомянуть в резюме.

Кстати, тот алгоритм на пхп записывается точно так же, там буквально подстрочник получается.

linuxnewb
()
Ответ на: комментарий от Ritmik

Я всего лишь показал на том примере то, что ново в C# и расписывается крутыми концепциями, в других языках, благодаря простому и продуманным изначально концепции и синтаксису, легко решается прикладными программистами без изменения базового языка.

Да вос похоже не доходит, что C# это ПОПУЛЯРНЫЙ OO язык и то как туда добавили элементы ФП - действительно интересно, так как впервые ФП сделали удобным в ПОПУЛЯРНОМ OO языке.

Благодаря этому ФП начало проникать в широки программистские массы и другие ПОПУЛЯРНЫЕ ЯП, например Java и C++ так как обнаружился интерес к УДОБНОМУ ФП в ОО ЯП.

Т.е. C# сделал то, чего популяризаторам list не удалось за 50 лет.

Или вы хотели сказать что lisp после первой публикации никогда не менялся?

grim ★★☆☆
()
Ответ на: комментарий от Stanson

Вы когда говорите «хороший код» - вы что имеете ввиду?
Код хороший должен быть для кого?

Programs must be written for people to read, and only incidentally for machines to execute.
- H. Abelson and G. Sussman (in «The Structure and Interpretation of Computer Programs)

Я ваще ни разу не страдаю. Для меня код хорош если он делает то, что нужно, работает максимально быстро и жрёт минимум памяти. Это хороший, годный код. И такой код я пишу без какого-либо напряжения. Это, в общем-то, даже является для меня хорошей развлекухой.

То что вы описали это по-умолчанию нужно делать. Я в этом треде совсем про другое. Главная цель - это борьба со сложностью. В больших проектах это очень важно. Тут то возможности языка и играют огромную роль.

Ritmik
()
Ответ на: комментарий от encyrtid

Свойства разворачиваются в приватное поле и 2 метода для set и get.

короче это вложенный класс, метод которого доступен прямо.

class Test
{
    class property
    {
        int get(){return x++;}
        int x;
    };
};
Test t;
t.get();// вернёт Test::property::x
так?

drBatty ★★
()
Ответ на: комментарий от Ritmik

Clojure является современным диалектом лиспа.

Ага.
Т.е. ваша фраза

легко решается прикладными программистами без изменения базового языка.

Опровергнута вами-же, так как не хватало-же кому-то базового языка.
Ну и хорошо.

grim ★★☆☆
()
Ответ на: комментарий от grim

Т.е. C# сделал то, чего популяризаторам lisp не удалось за 50 лет.

Патамушта над C# работали не безумные лисперы, а вменяемые хаскеляторы.

tailgunner ★★★★★
()
Ответ на: комментарий от Ritmik

Приведи весь код этой и хотя бы пары функций из моих примеров

просто, чтоб посмотреть на твои виляния:


где lazy-fact - хз
(defn fact [n] (reduce * (range 1 (inc n))))

(defn min-n-size-fact [m]
  (count (take-while (fn [fact] (< fact m)) (lazy-fact 1 1))))

(defn max-fact-befor [m]
  (last (take-while (fn [fact] (< fact m)) (lazy-fact 1 1))))
int fact( int n ) {
    int f = 1; for( int i=1 ; i<=n ; f*=++i );
    return f;
}

int fact_count( int m ) {
    int c=0; for( ; fact(c+1)<m ; ++c ); 
    return c;
}

int fact_max( int m ) {
    int r=0; for( int i=1 ; fact(i)<m ; r=fact(i), ++i ); 
    return r;
}
wota ★★
()
Ответ на: комментарий от Ritmik

Я получил от тебя код. Оценил его, как не реюзабельный.

такой тривиальный код проще написать ещё раз, чем ломать голову о том, как обернуть его в библиотеку. Зачем тебе функция из одной строки?

drBatty ★★
()
Ответ на: комментарий от Stanson

Зачем его использовать массово? Это же не пэхэпэ какой-то.

Если вещь хороша и полезна - почему бы её не использовать массово?

Поправлю: вещь хороша и полезна для массового использования.

Если ты не понимаешь что такое мроктор - иди почитай учебники полгодика, идиот, может дойдёт" - то про PHP бы никто не знал нынче.

Ничего плохого нет в том, что многим достаточно всю жизнь заниматься работой, для понимания которой достаточно, как обещают книжки по php, 48 часов.

Ritmik
()
Ответ на: комментарий от Stanson

А если бы все гуглимые доки про похапэ начинались бы с текстов типа «PHP это императивный язык с наличием мрокторов и развитой системой абырвалга. Основным элементом языка является брамтор, который представляет из себя инвариант мроктора низшего порядка....», а на вопросы начинающих ответы были бы в виде «Если ты не понимаешь что такое мроктор - иди почитай учебники полгодика, идиот, может дойдёт» - то про PHP бы никто не знал нынче.

тут ты не прав, ибо ВЕСЬ этот матан программист знать попросту ОБЯЗАН. Это как «экспонента» для математика, или там «шведка» для сантехника. Другое дело, что IRL этот матан не особо-то и нужен.

drBatty ★★
()
Ответ на: комментарий от Ritmik

Будет конкретный пример? Или так, фантазии?

пример если и будет, то не от меня. Что-бы найти уязвимость нужно хорошо знать ЯП и иметь опыт его использования. Я ФП знаю плохо. Если ты используешь ФП IRL - подумай, как его взломать. Только не рассказывай сказок, что это «невозможно», ибо сломать можно всё что угодно. Статистики уязвимости ЯП который использует 3.5 задрота, при этом исключительно для написания костылей для себя же (emacs например) - не нужно.

drBatty ★★
()
Ответ на: комментарий от drBatty

короче это вложенный класс, метод которого доступен прямо.

Нет.

using System;

namespace test
{
	class Test1
	{
		public int Property { get; private set; }
	}

	class Test2
	{
		private int propertyField;
		public int get_PropertyField ()
		{
			return propertyField;
		}

		private void set_PropertyField (int value)
		{
			propertyField = value;
		}
	}
}
Property из класса Test1 разворачивается компилятором в поле и 2 метода как в классе Test2. Property используется так же как и поля:
var t = new Test1();
int x = t.Property;
Естественно что каждое присваивание свойству и каждое обращение к нему заменяется компилятором на вызов соответствующих методов. Автоматическое свойство - это просто сахар над шаблоном создания приватного поля, геттера и сеттера.

encyrtid ★★★★★
()
Ответ на: комментарий от encyrtid

Func, Action - это просто предопределенные в библиотеке делегаты, для удобства. Во всех случаях где используются делегаты можно передавать любой метод с совпадающей сигнатурой.

Я ему уже писал, что различий нет но похоже безрезультатно :(

grim ★★☆☆
()
Ответ на: комментарий от grim

Да вос похоже не доходит, что C# это ПОПУЛЯРНЫЙ OO язык и то как туда добавили элементы ФП - действительно интересно, так как впервые ФП сделали удобным в ПОПУЛЯРНОМ OO языке.

О, какое знатное гет зе фактс!!! «Впервые!!!», «популярном!!!».

Цирк, едрёнть. :)

Stanson ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Смотря где он живет.

Неважно где.
Вся новая литература выходит сначала на английском.
Даже перевод справки в IDE может занять годы и человек будет просто отставать.

grim ★★☆☆
()
Ответ на: комментарий от tailgunner

Патамушта над C# работали не безумные лисперы, а вменяемые хаскеляторы.

Вот до хаскела руки так и не дошли :(

grim ★★☆☆
()
Ответ на: комментарий от Stanson

Цирк, едрёнть. :)

Cool!
Прошу вас, как главного клоуна исполнить номер о процессорах и функторах на БИС!

Бурные и продолжительные аплодисменты.

grim ★★☆☆
()
Последнее исправление: grim (всего исправлений: 1)
Ответ на: комментарий от grim

Смотря где он живет.

Неважно где.

Важно. Программист общается прежде всего с людьми, и, если эти люди говорят по-русски (к примеру), русский важнее английского.

tailgunner ★★★★★
()
Ответ на: комментарий от drBatty

тут ты не прав, ибо ВЕСЬ этот матан программист знать попросту ОБЯЗАН.

Я не против матана как такового. Я против элитаризации этого матана через маргинализацию и изобретение новояза.

Ведь можно про lisp рассказать доступно и просто. Чорт побери, lisp _ПРОЩЕ_ похапэ на порядок, а то и на два.

Вон, пришёл человек действительно разбирающийся в ФП и просто и понятно изложил на доступном любому программисту языке что такое лямбда и как она работает в lisp и прочем. При этом никакого новояза ФПшного не понадобилось вообще. Матан при этом есть? Есть. Но новояз с маргинальщиной отсутствует.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от quasimoto

Пусть бы было. То что функция сможет вернуть новую функцию в куче не страшнее возвращения новых данных malloc, всё равно можно руками почистить _точно так же_. Но язык бы стал выразительнее.

ага. «выразительнее». В php есть PCRE, а в последнем есть модификатор e, который выполняет код, который выловлен регэкспом. Это порождает настолько убогие, нечитаемые, и дырявые конструкции, что аффторов пхп хочется ЖЕЧЬ НАПАЛМОМ. За то, что они дали в руки быдлокодерам такую жуткую гадость. Как раз тот случай, когда благими намерениями устлана дорога в адъ.

На глобальную функцию. А не на локальную и замыкающую функцию рядом или сразу анонимную.

понятие «локальная функция» не имеет смысла в C/C++. Имеет смысл «локальный указатель(на функцию)», и «контекст выполнения функции». В этом есть смысл, как например есть смысл в delete this; Если ты это отменишь, то C/C++ попросту рухнут. Ты можешь сделать только имитацию неизменности функций. И да, отсутствие имени в C/C++ вполне допустимо, и я не вижу в этом ничего плохого. Вложенная функция в C/C++ не имеет смысла, как и локальная. Можно говорить лишь о вложенности/локальности имени и контекста этой функции. Т.е. код ВСЕГДА константный, и ВСЕГДА есть. Его просто видно не везде (как глобальные/локальные переменные static).

Такого требования нет.

значит только имитация ФП и остаётся.

А что это вообще такое? Ничего не демонстрирует

это демонстрирует факт возможности передачи контекста одной функции в другую. И причём без всяких замыканий. Функция вычисления квадрата ничего НЕ возвращает, а помещает результат в чужой контекст. Эта багофича сишечки иногда полезна, но обычно только мешает, из-за чего const я набираю за 100мс причём в любом состоянии :) А неконстантный указатель у меня вызывает зубную боль. (:

drBatty ★★
()
Ответ на: комментарий от grim

Т.е. C# сделал то, чего популяризаторам list не удалось за 50 лет.

Вы считаете, что в мире без C# было мало фп программистов? С остальным текстом поста по поводу C# я соглашусь.

Ritmik
()
Ответ на: комментарий от tailgunner

Т.е. C# сделал то, чего популяризаторам lisp не удалось за 50 лет.

Патамушта над C# работали не безумные лисперы, а вменяемые хаскеляторы.

Сразу видно - Специалист!

Ritmik
()
Ответ на: комментарий от drBatty

В php есть PCRE, а в последнем есть модификатор e, который выполняет код, который выловлен регэкспом

охренеть! а еще в пхп есть eval, который выполняет вообще любой код, который туда засунешь. За такое авторов Лиспа точно надо... постой, мы же про пхп?

linuxnewb
()
Ответ на: комментарий от Ritmik

Programs must be written for people to read, and only incidentally for machines to execute.

- H. Abelson and G. Sussman (in «The Structure and Interpretation of Computer Programs)

Результат следования этой догме - налицо. ФП является уделом академической науки и маргиналов. Программирование ради программистов - это тупик.

Ничто не мешает писать программы которые и людям читать удобно, и процессору переваривать легко.

Главная цель - это борьба со сложностью. В больших проектах это очень важно. Тут то возможности языка и играют огромную роль.

Это зависит от цели проекта, на самом деле. Например, какой-нибудь низкоуровневый LTE стек должен быть быстрым и маложрущим. Это большой проект, но скорость тут гораздо важнее сложности.

Конечно можно этот стек написать и на языке ФП, но из-за того, что ФП следует своим догмам, такое поделие, будь оно сколь угодно прекраным в разрезе догмы упомянутой выше, никому не будет нужно по причине той же самой догмы. Написать-то написали, а о том как и где оно должно работать - не думали вообще.

А было бы в ФП чуть меньше матана и догм, и чуть побольше мыслей о железках и объёмах памяти - наверняка уже существовал бы ФП годный для таких задач.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от grim

Clojure является современным диалектом лиспа.

Ага.
Т.е. ваша фраза

легко решается прикладными программистами без изменения базового языка.

Опровергнута вами-же, так как не хватало-же кому-то базового языка.
Ну и хорошо.

Мда. Clojure спроектированный язык, который взял от лиспа лучшее и привнес дополнительно вещи. Речь шла про этот базовый язык. Вы запутались в диалектах, т.к. не в теме. Если что-то непонятно, то лучше почитать или спросить.

Ritmik
()
Ответ на: комментарий от tailgunner

Программист общается прежде всего с людьми

Если каждое сообщение компилятора просить людей перевести, они быстро перестанут общаться :)

Xenesz ★★★★
()
Ответ на: комментарий от Ritmik

Видимо, речь о том, что ширнармассы, ежедневно использующие языки без элементов ФП, были как бы отлучены от этих техник.

linuxnewb
()
Ответ на: комментарий от wota
int fact( int n ) {
    int f = 1; for( int i=1 ; i<=n ; f*=++i );
    return f;
}

int fact_count( int m ) {
    int c=0; for( ; fact(c+1)<m ; ++c ); 
    return c;
}

int fact_max( int m ) {
    int r=0; for( int i=1 ; fact(i)<m ; r=fact(i), ++i ); 
    return r;
}

1. У вас в цикле в fact_max/fact_count для каждого i/c факториал заново вычисляется, а у меня O(N). Не, не пойдет. Вы сишник или где?

2. С последовательностями не получилось? Или получилось, но страшно?

Ritmik
()
Ответ на: комментарий от Stanson

ФП является уделом академической науки и маргиналов

это _учебник_ если что.

Это большой проект, но скорость тут гораздо важнее сложности.

Ты же не предлагаешь заниматься преждевременной оптимизацией?

Он (Ritmik) выше привел два варианта списка значений факториала. И я, хоть попенял ему на N^2, вполне допускаю такое увеличение вычислительной сложности во многих случаях.

linuxnewb
()
Ответ на: комментарий от Stanson

Смотря в какой ситуации. Если функция - это, например, какой-нибудь генератор градиента для графики, и вызывается на каждый пиксель, то лишние полсотни тактов при каждом вызове это фэйл. Вот тут, кстати, и могли пригодится лямбды которые возвращают натурально выполняемый код.

не пригодятся. если конечно компилятор их не догадается развернуть, а потом соптимизировать. тут фишка в том, что например в первопнях два ALU, и они умеют выполнять две АРИФМЕТИЧЕСКИЕ операции за такт. Например за один такт они могут прибавить что-нибудь к двум разным вершинам. Потому компиляторы уже лет 10 выполняют циклы по две итерации сразу, и мешают друг с другом эти итерации. Под i586 и старше это даёт огромный профит. Но если это - две функции, то очевидно их не смешать (тут уже два процессора надо. Даже двух ядер и то мало).

Или, например, это код для небыстрой однокристалки, под какую-нибудь задачу где каждый такт на счету.

это важно и для обычных камней. задолбаешься вычленять неизменную часть из цикла, да и часто это и невозможно, разве что на чистом асме. А компилятор сейчас это делать любит и умеет. Зачем ему мешать-то?

В этом случае оно вообще не сможет соптимизироваться, да.

самое смешное, что ВНЕЗАПНО - может. Эти господа таки как-то пытаются. Вот только IRL эффект естественно намного хуже, чем у константного кода.

drBatty ★★
()
Ответ на: комментарий от drBatty

Я получил от тебя код. Оценил его, как не реюзабельный.

такой тривиальный код проще написать ещё раз, чем ломать голову о том, как обернуть его в библиотеку. Зачем тебе функция из одной строки?

Разве не очевидно? Чтобы не повторять одну и ту же реализацию много раз.
Если на простом примере не получилось, то про больший код я уже боюсь спросить.

Ritmik
()
Ответ на: комментарий от grim

Если знаешь язык то можешь думать на нём. Невозможно построить осмысленную беседу на этом языке, постоянно переводя с другого.

причём тут беседа?

А для программиста хорошо знать английский важнее чем русский.

почему? мне хватает умения читать английские тексты.

drBatty ★★
()
Ответ на: комментарий от drBatty

потому-то я и говорю, что ФП более уязвимо в общем, сферическом случае.

Будет конкретный пример? Или так, фантазии?

пример если и будет, то не от меня. Что-бы найти уязвимость нужно хорошо знать ЯП и иметь опыт его использования. Я ФП знаю плохо.

Соединим две твои фразы: «Я ФП знаю плохо ... потому-то я и говорю, что ФП более уязвимо в общем, сферическом случае».

Проявился, так сказать, во всей красе. Молодец!

Ritmik
()
Ответ на: комментарий от Ritmik

У вас в цикле в fact_max/fact_count для каждого i/c факториал заново вычисляется

да, я уже писал про константы:

int fact( int n ) {
    static int r[ MAX_F ];
    if( !*r ) for( int i=0 ; i<MAX_F ; r[i] = i ? r[i-1]*(i+1) : 1, ++i );
    return r[n-1];
}

Вы сишник или где?

где

2. С последовательностями не получилось?

там аналогично - можешь сам проверить

wota ★★
()
Ответ на: комментарий от drBatty

задолбаешься вычленять неизменную часть из цикла, да и часто это и невозможно

О! Здрвая мысль!

Теперь можешь вернуться к моему примеру на пхп и прочитать его в этом новом для себя контексте.

linuxnewb
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.