metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2015-08-12 10:56 am

Запретить жабу, дотнет, пхп, перл и крестики, только ФП, только хардкор

https://medium.com/@yelbota/%D0%BA%D1%80%D1%83%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%BE%D1%82-%D1%83%D0%BD%D1%8B%D0%BB%D1%8B%D1%85-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%BE%D0%B2-612c72738d04

Пройдет время, некоторым не повезет, и они встретят кризис среднего возраста в одиночестве, платя алименты ушедшей жене. Когда-то давно она прочитала в Космо, что программисты — это новые рок-звезды, но ушла, когда узнала что ее муж, унылый похапешник, не комитит на гитхаб. Другим повезет: они смогут проскочить в тимлиды, и руководство заткнет ими купленный слот на отраслевой конференции. Там они самоутвердятся, рассказав молодым, что унылыми быть круто. И спираль уныния выйдет на новый виток, засосав еще больше классных ребят.

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

[identity profile] metaclass.livejournal.com 2015-08-13 07:08 am (UTC)(link)
Первый пункт при неосмысленном применении за 5-10 лет приводит компанию в болото, с доисторическими жабами, коболами, дельфи и фокспро. Я понимаю, тупым дедам удобнее, "всегда так делали", но технический долг надо бы разгребать.

Функциональщина в имеющихся языках - это уныние. Макросы в C#? LINQ в жабе? Алгебраические типы данных хотя бы в одном из мейнстримных языков?

[identity profile] thesz.livejournal.com 2015-08-13 11:48 am (UTC)(link)
Не то слово.

Я недавно словил "выход за границы массива" в коде вида for (int i=0;i < s.Length; i++) { var p = QQ(c => c == s[i],p); }

Замыкания в C# замыкают не значения, а ссылки на переменные!

Исходил дерьмом минут двадцать, пока не понял, что это как Питоне.

Ужас. Даже в Лиспе нормальные замыкания с 1983 года. Куда эти плагиаторы смотрят?

(с другой стороны, tie the knot по другому в семантике C# не сделать, а он мне нужен)

[identity profile] metaclass.livejournal.com 2015-08-13 04:56 pm (UTC)(link)
>Замыкания в C# замыкают не значения, а ссылки на переменные!

Ооо, это известный прикол. "Вышел из цикла, и все переменные указывают на значение в последней итерации".
причем что-то вроде int j=i; внутри цикла от этого помогает.

[identity profile] thedeemon.livejournal.com 2015-08-13 04:57 pm (UTC)(link)
А где замыкания с _мутабельными_ переменными работают иначе?
Разве что в С++, где можно явно выбирать между ссылкой и копией.

[identity profile] metaclass.livejournal.com 2015-08-13 05:12 pm (UTC)(link)
Там же и работают. Только переменную внутри тела цикла или делегата переприсвоить надо :)

[identity profile] thedeemon.livejournal.com 2015-08-13 05:20 pm (UTC)(link)
Это не "иначе", необходимость в ручном копировании есть следсвие замыкания-по-ссылке.

[identity profile] pupsikk.livejournal.com 2015-08-14 10:48 am (UTC)(link)
Мне кажется (только кажется, наверняка я не знаю) это следствие более тяжелой проблемы - Компиляция (она же Оптимизация) Головного Мозга.
Это такая парадигма в языкостроении, когда возможности языка подгоняются под ограничения компилатора.
То есть вот сидит такой изобретатель языка и пытается впихнуть него замыкание по всем правилам, вдруг его озаряет: а как же блин я эту фичу переложу на ассемблер? Это ж получится жутко сложно и неэффективно, да? А такое ж немыслимо. Нунах, лучше возьму молоточек и щас у меня замыкание станет другим. и тогда в ассемблер влезет. А пользователю что? Он даже не заметит. Сожрет и похвалит, и добавки попросит.

[identity profile] lispnik.livejournal.com 2015-08-14 06:00 am (UTC)(link)
В лиспе точно такие же замыкания.

[identity profile] thesz.livejournal.com 2015-08-14 06:52 am (UTC)(link)
Я срочнейшим образом поменял своё мнение о Лиспе на "никогда вообще". Питон со скобками, блин.

[identity profile] lispnik.livejournal.com 2015-08-14 07:00 am (UTC)(link)
Дело твоё, какое мнение о чём иметь, конечно, но это единственная вменяемое поведение для языка с присваиванием.

[identity profile] thesz.livejournal.com 2015-08-14 07:16 am (UTC)(link)
Нет, и Haskell тому пример.

[identity profile] lispnik.livejournal.com 2015-08-14 07:21 am (UTC)(link)
Там нет присваиваний в том виде, о котором я говорю.

[identity profile] thesz.livejournal.com 2015-08-14 07:25 am (UTC)(link)
В каком виде вы о них говорите?

[identity profile] lispnik.livejournal.com 2015-08-14 07:31 am (UTC)(link)
Без монад State/IO/etc, без STM и прочего. В Haskell есть присвавания таком виде, как в Python/Lisp/C/Fortran? И C# до кучи? :)

[identity profile] thesz.livejournal.com 2015-08-14 08:58 am (UTC)(link)
При желании есть. Но надо очень стараться (много чего перегрузить в очередной монаде или около того, или unsafe использовать).

[identity profile] lispnik.livejournal.com 2015-08-14 09:03 am (UTC)(link)
Вам не кажется, что я кое-что другое имел в виду, а unsafe-позу раком?

[identity profile] thesz.livejournal.com 2015-08-14 09:46 am (UTC)(link)
Вас не затруднит излагать свои мысли чуть более развёрнуто?

Я вообще не могу извлечь смысл из вашего однострочного комментария.

[identity profile] lispnik.livejournal.com 2015-08-14 07:29 am (UTC)(link)
Да, а что случилось в 1983 году? Я просто плохо помню это время :)

[identity profile] thesz.livejournal.com 2015-08-14 08:54 am (UTC)(link)
Приняли стандарт Common Lisp, куда попали замыкания из MacLisp.

[identity profile] lispnik.livejournal.com 2015-08-14 09:00 am (UTC)(link)
А, Common Lisp (http://clhs.lisp.se/Body/03_ad.htm), понятно. Правда, Википедия врёт, что появился он в 1984, а стандарт приняли в 1994, но это мелочи. Я к оговоркам не придираюсь.

[identity profile] thesz.livejournal.com 2015-08-14 09:44 am (UTC)(link)
http://thesz.livejournal.com/533562.html

Вот, нашёл.

Видимо, dynamic binding ещё хуже, чем то, что есть сейчас в Лиспе, поскольку с ним вообще не получается использовать Лисп в качестве функционального языка.

[identity profile] lispnik.livejournal.com 2015-08-14 09:55 am (UTC)(link)
dynamic binding -- да, оно такое.

[identity profile] rashid80.livejournal.com 2015-08-20 09:36 am (UTC)(link)
>for (int i=0;i < s.Length; i++) { var p = QQ(c => c == s[i],p); }
простите, что это за х_йня. Для чего тут цикл? что мешало вместо него сделать (for)each с лямбдой?

[identity profile] thesz.livejournal.com 2015-08-20 10:28 am (UTC)(link)
В оригинале проход по строке идёт в обратном порядке.

Поскольку это критическое по времени место (именно так), преобразовывать в IEnumerable и разворачивать для прохода через foreach смысла не имело.