http://www.pdfbooksplanet.org/tags/Chris+Weed/
Функциональное программирование на С++.
Chris Weed.
Всего 100 с небольшим страниц, но написано шикарно!
Абсолютно без вода, только небольшое введение — и код, код, код...
Уже первая глава — рекурсивная форма стандартных алгоритмов.
Понятная даже начинающим.
Неистово рекомендую!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>http://www.pdfbooksplanet.org/tags/Chris+Weed/ LVV>Функциональное программирование на С++. LVV>Chris Weed. LVV>Всего 100 с небольшим страниц, но написано шикарно! LVV>Абсолютно без вода, только небольшое введение — и код, код, код... LVV>Уже первая глава — рекурсивная форма стандартных алгоритмов. LVV>Понятная даже начинающим. LVV>Неистово рекомендую!
так а это разве правильно — рекурсивная форма алгоритмов на с++? или уже появилась возможность контроля размера стека?
LVV>>Уже первая глава — рекурсивная форма стандартных алгоритмов. LVV>>Понятная даже начинающим. LVV>>Неистово рекомендую! __>так а это разве правильно — рекурсивная форма алгоритмов на с++? или уже появилась возможность контроля размера стека?
Первое, что в книжке объясняется: побочный эффект и чистые функции без побочных эффектов.
Потом берет и пишет рекурсивную форму многих стандартных алгоритмов.
И не просто пишет, а сравнивает со стандартной реализацией в указанной им платформе.
В половине случаев рекурсивная версия оказывается эффективнее.
Потом у него лямды, потом — ленивые вычисления...
В общем, то, что я успел посмотреть-почитать — мне ОЧЕНЬ понравилось.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>>>Уже первая глава — рекурсивная форма стандартных алгоритмов. LVV>>>Понятная даже начинающим. LVV>>>Неистово рекомендую! __>>так а это разве правильно — рекурсивная форма алгоритмов на с++? или уже появилась возможность контроля размера стека? LVV>Первое, что в книжке объясняется: побочный эффект и чистые функции без побочных эффектов. LVV>Потом берет и пишет рекурсивную форму многих стандартных алгоритмов. LVV>И не просто пишет, а сравнивает со стандартной реализацией в указанной им платформе. LVV>В половине случаев рекурсивная версия оказывается эффективнее. LVV>Потом у него лямды, потом — ленивые вычисления... LVV>В общем, то, что я успел посмотреть-почитать — мне ОЧЕНЬ понравилось.
не, я немного про другое — что на с++ рекурсивный подход использовать мало того, что сомнительно по эффективности, так еще и небезопасно по переполнению стека. вот вы знаете, как удостовериться, что размера стека хватит?
Здравствуйте, _hum_, Вы писали:
__>так а это разве правильно — рекурсивная форма алгоритмов на с++? или уже появилась возможность контроля размера стека?
Вообще нет, но многие (все?) компиляторы оптимизируют хвостовую рекурсию в цикл, при включённых оптимизациях.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, _hum_, Вы писали:
__>>так а это разве правильно — рекурсивная форма алгоритмов на с++? или уже появилась возможность контроля размера стека?
EP>Вообще нет, но многие (все?) компиляторы оптимизируют хвостовую рекурсию в цикл, при включённых оптимизациях.
так не всегда же к хвостовой можно свети — это раз. а во-вторых, если нет гарантии, то код подойдет только для баловства.
Здравствуйте, LaptevVV, Вы писали:
LVV>http://www.pdfbooksplanet.org/tags/Chris+Weed/ LVV>Функциональное программирование на С++. LVV>Chris Weed. LVV>Всего 100 с небольшим страниц, но написано шикарно! LVV>Абсолютно без вода, только небольшое введение — и код, код, код... LVV>Уже первая глава — рекурсивная форма стандартных алгоритмов. LVV>Понятная даже начинающим. LVV>Неистово рекомендую!
Вот что меня настораживает так это такие книги. Они решают искуственные проблемы искуствееными методами. И все рады как это круто.
Есть нормальные языки для работы в таком стиле, зачем всё пихать в одну кучу?
На любом полном языке можно писать фортраном. Так что радоватья особо нечему.
C++ идёт неведомо куда, он создаёт всё новые и новые трудности которые потом пытается преодолеть.
Если вам надо мето-программирование и другие моделирования до синтеза кода, так что мешает это разделить на разные этапы
зачем всё пихить в один этап компиляции?
Например надо тебе колекцию с заданными свойствами, указал требование тебе синтезирует оптимальную колекцию, и используй.
Запросил оптимизировать и выкинуть лишее. Вуаля. Двигайся дальше.
Надо поменял требование получил другую рализацию, проверил скороть и потребление на реальном железе и данных сделал выводы.
Для чего таскать весь лишний мусор в виде шаблонов на все случаи, которые вместо облегчения жизни станут лютым гемороем.
И использовать их не по назначению, а для получения функционала которого изначально нет в языке.
ps: Послушал выступление негра из MS про модули. Это признание в том что они неосилили задачу и скорее всего не осилят, учитывая всё навороты и прибабахи которые хотят отставить в этих модулях.
pps: Я бы добавил в C++ функционал depedecated на функции языка что бы от них можно было избавлятся или хотябы проверять что их нет в коде.
Здравствуйте, _hum_, Вы писали:
__>Здравствуйте, LaptevVV, Вы писали:
__> на с++ рекурсивный подход использовать мало того, что сомнительно по эффективности,
в принципе рекурсия при fastcall может быть эффективнее выделения памяти на куче и обгоняет многие алгоритмы с ветвлением которое проц не может предсказать. но никакой гарантии нет. если понимать что у компилятора под капотом то можно получить выигрыш по скорости, применив рекурсию. но если не понимать, то можно очень сильно проиграть
__> так еще и небезопасно по переполнению стека. вот вы знаете, как удостовериться, что размера стека хватит?
это да. стека мало, причем непредсказуемо мало. на разных платформах его разное кол-во и по современным меркам зачастую ничтожное. даже если нам известно сколько стека выделяет ось нашему потоку, то в общем случае нам неизвестно сколько скушали остальные функции на момент вызова нашей. если рекурсивная функция А вызывает рекурсивную функцию Б, то мне становится страшно.
__>я к тому веду, что такие вещи естественнее изучать на соответствующих языках
+1
есть куча языков где рекурсия кушает не стек, а кучу. хотя накладные расходы на вызов функции в общем случае неизвестны. даже если это рекурсивный обход каталогов, то очень может быть что накладные расходы скушают всю кучу...
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
__>>я к тому веду, что такие вещи естественнее изучать на соответствующих языках М>+1 М>есть куча языков где рекурсия кушает не стек, а кучу.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, мыщъх, Вы писали:
__>>>я к тому веду, что такие вещи естественнее изучать на соответствующих языках М>>+1 М>>есть куча языков где рекурсия кушает не стек, а кучу.
EP>Это скорее относится к компиляторам, чем к языку. Например есть такие штуки как Split Stacks, Segmented Stacks.
а есть _универсальный_ рецепт для си (си++) ?
давайте исходить из того, что мы пишем код не под конкретный компилятор.
нерекурсивный подход скорее всего будет работать везде. рекурсивный же это хождение по минному полю. умеючи можно и рекурсивно. но все-таки слишком рисковано.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
М>а есть _универсальный_ рецепт для си (си++) ? М>давайте исходить из того, что мы пишем код не под конкретный компилятор.
C++ работает везде — и на современных десктопах, и на микроконтроллерах, и даже на древних компьютерах типа Commodore 64.
Поэтому писать под что-то конкретное, по-крайней относительно памяти, таки придётся.
М>нерекурсивный подход скорее всего будет работать везде.
Если под нерекурсивным понимается цикл без выделения памяти (а-ля оптимизация хвостовой рекурсии) — то да, везде.
Если же речь про тот же стэк но в куче — то нужно понимать что на конечном устройстве может и не быть никакой кучи без доп.движений, а вот стэк скорей всего будет. В среднем же по больнице стэк в куче будет более универсальным.
М>рекурсивный же это хождение по минному полю. умеючи можно и рекурсивно.
Ну да, при желании можно и рекурсивно, например:
1. убеждаться в оптимизации хвостовой рекурсии
2. выделять много адресного пространства под стэк
3. использовать фрагментированные стэки
4. ограничивать глубину рекурсии логарифмом, например как в нормальных реализациях quicksort
М>но все-таки слишком рисковано.
LVV>>В общем, то, что я успел посмотреть-почитать — мне ОЧЕНЬ понравилось. __>не, я немного про другое — что на с++ рекурсивный подход использовать мало того, что сомнительно по эффективности, так еще и небезопасно по переполнению стека. вот вы знаете, как удостовериться, что размера стека хватит?
Это не вопрос парадигмы и стиля программирования.
А в означенной мной книжке речь идет о функциональном стиле кода в С++. __>я к тому веду, что такие вещи естественнее изучать на соответствующих языках (меня в свое время впечатлила P.Van Roy, S. Haridi. Concepts, Techniques, and Models of Computer Programming)
Вот за это — спасибо!
Уже посмотрел — книжка блеск!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>>>В общем, то, что я успел посмотреть-почитать — мне ОЧЕНЬ понравилось. __>>не, я немного про другое — что на с++ рекурсивный подход использовать мало того, что сомнительно по эффективности, так еще и небезопасно по переполнению стека. вот вы знаете, как удостовериться, что размера стека хватит? LVV>Это не вопрос парадигмы и стиля программирования. LVV>А в означенной мной книжке речь идет о функциональном стиле кода в С++. __>>я к тому веду, что такие вещи естественнее изучать на соответствующих языках (меня в свое время впечатлила P.Van Roy, S. Haridi. Concepts, Techniques, and Models of Computer Programming) LVV>Вот за это — спасибо! LVV>Уже посмотрел — книжка блеск!
ага. именно после таких книг понимаешь, что пытаться демонстрировать (в том числе студентам) приемы декларативного программирования на императивном языке — это как играть в хоккей на траве
Здравствуйте, _hum_, Вы писали:
__>ага. именно после таких книг понимаешь, что пытаться демонстрировать (в том числе студентам) приемы декларативного программирования на императивном языке — это как играть в хоккей на траве
Книжка отличная, но почему бы не демонстрировать? C++ — язык мейнстрима, на нём пишутся быстрые программы, его многие знают. Если тем, кто его знает, можно с его помощью показать какие-то красивые идеи, которые они потом смогут использовать, то почему бы это не сделать? Можно, конечно, их показывать на Хаскеле или Ерланге, но пользователи оных, во-первых, и так хорошо знают про рекурсию, а во-вторых, "узок круг этих людей, страшно далеки они от народа".
__>так не всегда же к хвостовой можно свети — это раз. а во-вторых, если нет гарантии, то код подойдет только для баловства.
К хвостовой сводятся только элементарные циклы, это не очень интересно.
А полную гарантию даёт только похоронное бюро
Жалко, что она выложена на какие-то жлобские файлохранилища.
Варез? (украдено у амазона?)
LVV>Всего 100 с небольшим страниц, но написано шикарно! LVV>Абсолютно без вода, только небольшое введение — и код, код, код...
Вся вода — в коде.
Читать по сто раз один и тот же паттерн хвостовой рекурсии — тоскливо.
Например, очевидно же, что all_of, any_of, none_of отличаются друг от друга только операцией.
И более того, выражаются друг через друга, по правилам де Моргана
template<class It, class Pred>
bool all_of(It begin, It end, Pred&& pred) {
return begin == end ? true
: pred(*begin) && all_of(next(begin), end, pred);
}
template<class It, class Pred>
bool none_of(It begin, It end, Pred&& pred) {
return all_of(begin, end, not_(pred));
}
template<class It, class Pred>
bool any_of(It begin, It end, Pred&& pred) {
return !none_of(begin, end, pred);
}
Здравствуйте, cures, Вы писали:
C>Здравствуйте, _hum_, Вы писали:
__>>так не всегда же к хвостовой можно свети — это раз. а во-вторых, если нет гарантии, то код подойдет только для баловства.
C>К хвостовой сводятся только элементарные циклы, это не очень интересно. CPS же
Здравствуйте, kov_serg, Вы писали:
_>ps: Послушал выступление негра из MS про модули. Это признание в том что они неосилили задачу и скорее всего не осилят, учитывая всё навороты и прибабахи которые хотят отставить в этих модулях.
Наконец, хотя этот предмет не из приятных, я должен упомянуть PL/1, язык программирования, документация которого обладает устрашающими размерами и сложностью. Использование PL/1 больше всего напоминает полет на самолете с 7000 кнопок, переключателей и рычагов в кабине. Я совершенно не представляю себе, как мы можем удерживать растущие программы в голове, когда из-за своей полнейшей вычурности язык программирования — наш основной инструмент, не так ли! — ускользает из-под контроля нашего интеллекта. И если мне понадобится описать влияние, которое PL/1 может оказывать на своих пользователей, ближайшее сравнение, которое приходит мне в голову, — это наркотик. Я помню лекцию в защиту PL/1, прочитанную на симпозиуме по языкам программирования высокого уровня человеком, который представился одним из его преданных пользователей. Но после похвал в адрес PL/1 в течение часа он умудрился попросить добавить к нему около пятидесяти новых "возможностей", не предполагая, что главный источник его проблем кроется в том, что в нем уже и так слишком уж много "возможностей". Выступающий продемонстрировал все неутешительные признаки пагубной привычки, сводящейся к тому, что он впал в состояние умственного застоя и может теперь только просить еще, еще, еще. Если FORTRAN называют детским расстройством, то PL/1, с его тенденциями роста подобно опасной опухоли, может оказаться смертельной болезнью
Здравствуйте, LaptevVV, Вы писали:
LVV>Абсолютно без вода, только небольшое введение — и код, код, код... LVV>Уже первая глава — рекурсивная форма стандартных алгоритмов.
Я нет какой-нибудь книжки о том, как использовать стиральную машину для перемешки салатов?
Я к тому, что каждому инструменту свое применение.
Здравствуйте, _hum_, Вы писали:
__>не, я немного про другое — что на с++ рекурсивный подход использовать мало того, что сомнительно по эффективности, так еще и небезопасно по переполнению стека. вот вы знаете, как удостовериться, что размера стека хватит?
Ну вот автор книжки ссылается на фундаментальнейшую теорему "Ей-богу, так!".
The Apple LLVM version 6.1.0 compiler was used to compile the samples in this book using the “-O3” option that includes tail-call optimization.
Такая оптимизация действительно может иметь место, но как удостовериться, что со всей этой рекурсией мы действительно не отстрелим себе ногу, и что делать пользователям других компиляторов — об этом ни слова.
Книга по большей части написана в виде <summary>\r\n<code>.
Лучше бы автор вместо нее просто сделал репозиторий.
И еще бы привел код, использованный для сравнения производительности.
А то все таблица Run-time Results похожа на сравнение порошков.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, Pzz, Вы писали:
Pzz>Я нет какой-нибудь книжки о том, как использовать стиральную машину для перемешки салатов?
Есть отличное прменение для ультразвуковой стиральной машины в функциональном стиле http://alkohacker.ru/samy-j-by-stry-j-retsept-samogona-braga-za-1-sutki
Pzz>Я к тому, что каждому инструменту свое применение.
Категорически поддерживаю. Растраивает только то что раньше C++ можно было применить куда угодно,
а теперь С++(n+1) уже даже на winxp не работает и это видимо не предел.
Но у C++ есть очень отличная черта он поддерживает C. А это очень живучий и не требовательный язык.