LINUX.ORG.RU

The ideas behind functional programming are simple, powerful and practically useful. But the presentation layer is of a very low quality

Весело у них там, я смотрю. Где они траву берут?

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

Где они траву берут?

У еванлилистов дракона.

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

Advanced Branching with Switch

Банальный переключатель уже характеризуется как «Advanced Branching», и это при том, что в Erlang'е есть сопоставление с образцом.

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

Самая мякотка:

Tail recursion is a trick. Some recursive algorithms must be implemented with tail recursion. Otherwise they get too slow. But tail recursion is not intuitive. It requires very intensive thinking to do it right and adds complexity to the original algorithm. Tail recursion is an evil remnant of ancient compilers. Hopefully, developments in compiler technology will take care of that.

Это феерично! Гениально!

anonymous
()

Гм, все на tcl.

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

Надо чтобы дело делалось. А для большинства императивщиков хвостовая рекурсия не только rocket science, но и junior-level быдлокод. Учитывая ограниченость компиляторов если оптимизация не произойдет, то это и ест быдлокод.

Но да, написано в стиле Visual Basic for Dummies

vertexua ★★★★★
()

на выходе фигня - ни то ни сё

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

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

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

Учитывая ограниченость компиляторов если оптимизация не произойдет

@tailrec же решает эту проблему в scala, вроде. Что, больше такого нигде нет?

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

Ну все же много где нет. В C/C++ вообще разброд и шатания, CLR есть поддержка, но нет гарантий, в JVM вообще нет. И если везде на этих платформах городить хвостовую рекурсию, то будет больно. Тем более сто списки в этих ЯП например тоже не совсем дружелюбно

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

в JVM вообще нет

в scala хвостовая рекурсия преобразуется в цикл на уровне компилятора в байт-код, я правильно понимаю?

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

Да. Все делает компилятор. А в JVM поддержки нет.

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

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

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

Причем тут шарп? CLR гарантирует, что вызов с префиксом .tail будет хвостовым.

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

Он про CLR вообще, в F# есть хвостовая рекурсия и она работает (правда в F# 2.0 не было атрибута для гарантированной хвостовой рекурсии, что в 3.0 я не знаю).

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

В C# - нет, там мутабельные списки (но никто не мешает тебе сделать через расширение типов свой интерфейс работы со стандартными списками через Head + Tail). В F# иммутабельные списки работающие через head + tail + имеется доступ к элементам по индексу. Плюс свободный каст, как минимум System.Collection.Generic.List<T> в list<T> F#(на счёт обратно не знаю, но никто не запрещает и из C# дёргать F#'овый список, сборку только нужную подключи и всё).

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

P.S. а вообще иммутабельность, в явном виде, не особо нужна для списков в C#. Там задачи на такую обработку решаются через Linq и PLinq (параллельный Linq).

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

Иногда все таки нужно не через функции высшего порядка

vertexua ★★★★★
()

Зачем этот Дракон вообще нужен? Любая более-менее сложная программа в виде диаграммы будет занимать неприлично много места, и ее совершенно невозможно будет понять.

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

Это не так. Ребята из National Instruments с тобой не согласны, а лично у меня был живой пример человека, который написал на LabView, в одиночку, приложение для встраиваемой системы по тестированию каких-то там двигателей (стендовая фиговина, которая должна снимать с колёсных пар вагонов показатели по датчикам и обрабатывать всё это дело). Он мне эту программу показывал, там всё довольно легко можно понять было, т.к. каждая подпрограмма реализовывается либо как комбинационный элемент, либо как КДА, а потом уже отображается квадратиком со входами и выходами на более высокоуровневом участке схемы.

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

Вообще доля правды есть. Релаится на то, что компилятор заоптимайзит - это какое-то ковбойство. Мне нравится как сделано в Clojure - там специальная форма для этого - loop/recur, не ошибешся.

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

Релаится на то, что компилятор заоптимайзит - это какое-то ковбойство.

В современных функциональных языках гарантируется TCO. С другой стороны, в соврменном С++ расчитывают на оптимизации шаблонного кода более сложные чем TCO.

В Scheme, кстати, есть named let, как loop/recur в Clojure.

Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.