Вы видите копию треда, сохраненную 4 марта 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Читать: https://www.braveclojure.com
Решать: http://www.4clojure.com
Онлайн: https://repl.it/site/languages/clojure
Офлайн: https://leiningen.org
Зомби: http://www.parens-of-the-dead.com/
https://clojure.org/guides/getting_started
https://clojure.org/reference/documentation
https://github.com/bbatsov/clojure-style-guide
Clojurescript
https://clojurescript.org
https://github.com/bhauman/lein-figwheel
https://github.com/emezeske/lein-cljsbuild
Документация
https://clojuredocs.org/
https://clojure.org/api/cheatsheet && https://cljs.info/cheatsheet/
https://clojure.org/reference/documentation
Задачи
http://www.4clojure.com
http://clojurekoans.com
http://clojurescriptkoans.com
http://exercism.io/languages/clojure/about
Видео
https://github.com/tallesl/Rich-Hickey-fanclub#talks
https://www.youtube.com/user/ClojureTV
Комьюнити
#
http://clojurians.slack.com/
https://groups.google.com/forum/#!forum/clojure
https://clojureverse.org/
https://stackoverflow.com/questions/tagged/clojure
Блоги
Еженедельник: https://therepl.net
Все блоги: http://planet.clojure.in
Производительность: http://clojure-goes-fast.com
IDE
https://cursive-ide.com
http://lighttable.com
http://nightcoders.net
https://sekao.net/nightcode && https://sekao.net/lightmod
https://cider.readthedocs.io/en/latest
Библиотеки
https://clojars.org && https://www.clojure-toolbox.com
Web: http://www.luminusweb.net || https://github.com/weavejester/compojure
App Server: http://immutant.org || http://aleph.io
DI: https://github.com/stuartsierra/component
SQL: https://github.com/layerware/hugsql
UI (cljs): https://github.com/Day8/re-frame || https://github.com/omcljs/om
HTML: https://github.com/weavejester/hiccup
Macros: https://github.com/cgrand/macrovich
Spec: https://github.com/bhb/expound && https://github.com/jeaye/orchestra
Test: https://github.com/clojure/test.generative && https://github.com/bensu/doo (cljs)
FAQ
— СКОБКИ!!11
http://clochure.org/
— Кейворды?..
https://clojure.org/guides/faq#why_keywords
— Common Lisp же есть, нинужна!!1
Просто съеби.
— Что нужно для вкатывания?
Знать английский, не быть тупым, иметь опыт программирования.
— Хочу начать изучать программирование, clojure мне подойдет?
Лучше сперва возьми PLT Racket и читай SICP + http://htdp.org
— Обязательно знать джаву и жс?
На уровне чтения документации.
— Как без классов представлять бизнес-сущности?
Используй хэшмапы, namespaced keywords и spec. Не поддавайся искушению создавать рекорды на каждый чих. Все есть данные.
— Что по скорости?
Зависит от задачи. В среднем - медленнее скалы, быстрее рубипитонов.
— Печатаю элементы последовательности, а они не печатаются, ЧЯДНТ?
Ленивость + сайд-эффекты => используй doall или dorun.
— Итерируюсь по большой последовательности и получаю OutOfMemoryException, ЧЯДНТ?
https://clojure.org/reference/lazy#_don_t_hang_onto_your_head
— DSL - круто! Можно теперь все API делать на макросах?
The first rule of macro club is: "Don't write macros".
— Кто использует clojure в продакшне?
Walmart, Netflix, Soundcloud, Spotify, Facebook, Groupon, CircleCI, Heroku, Puppet, Red Hat, Oracle.
— Какие приложения написаны на clojure?
Walmart eReceipts - бэкенд обработки данных о покупках во всех отделениях Walmart для их мобильного приложения.
https://www.datomic.com - распределенная транзакционная база данных с языком запросов на основе datalog.
http://lighttable.com - расширяемая интерактивная IDE для clojure, python и javascript.
https://precursorapp.com - инструмент для коллективного прототипирования онлайн (рекомендую попробовать, зависимость есть).
http://circleci.com - Continuous Integration and Delivery. Бэкенд и фронтенд на clojure+clojurescript.
Архивач: https://arhivach.org/thread/339594/
Старый общий лиспотред: https://2ch.hk/pr/res/1057101.html (М)
Дополняйте шапку.
насколько оно в обще сейчас перспективно?
как снизить ресурсопотребляемость при компиляции?
какой диалект лучше всего подходит?
есть интересные проекты?
д
Что именно такого ты подразумеваешь под метапрограммированием, что тебя беспокоит ресурсопотребляемость при компиляции?
>как снизить ресурсопотребляемость при компиляции?
Крестовик чтоле сука? За пределами крестов таких проблем больше нигде вроде бы и нет.
>есть интересные проекты?
Хз, что тебе будет интересным.
Ну, например, можешь поглядеть это:
http://redlinernotes.com/docs/cl-6502.pdf и код полностью: https://github.com/kingcons/cl-6502
Тут тебе и пример использования макросов неплохой (например, как опкоды задаются), и код легковоспринимаемый, и в описании всё разжевано.
https://pragprog.com/book/shcloj3/programming-clojure-third-edition
Все обновлено до версии 1.9, добавили информацию про spec, трансдьюсеры и cli-интерфейс.
Ну и на какой ответ ты рассчитываешь?
Ожидаешь, что тебе покажут суперсекретный сайт clojure-rabota-mukhosransk.io, где каждый день выставляется по сотне вакансий на кложе в твоей мухосрани, и все работодатели готовы выждать неделю-месяц-год-сколько нужно, пока ты, жемчужина рынка труда, раздуплишься, освоишь язык да наконец вылезешь из своей раковины?
по версии stackoverflow за clojure платят больше всего в мире. Но вакансий почти нет, это да
>по версии stackoverflow за clojure платят больше всего в мире
Слабо верится, что за кложу платят больше, чем, скажем, за сап.
>верится
можно не верить, но факты таковы
https://insights.stackoverflow.com/survey/2017#technology-top-paying-technologies-by-region
>Globally, developers who use Clojure in their jobs have the highest average salary at $72,000.
Надо в оп-пик треда добавить, кхе-кхе.
Впрочем, оно и понятно: кложа за деньги == сеньор (и притом топовый) в 86% случаев.
Охлол. На самом деле, лучше этого никому не показывать. По остальным табличкам несложно догадаться, что большинство из этих очень немногочисленных кложе-везунчиков работает в США и получает средненькие деньги по их меркам.
>tfw даже пхпшники получают больше
А с работой, судя по тем данным, все очень грустно. Даже с хаскелем устроиться легче.
На самом деле, с оккупацией там какие-то очень сомнительные данные. По ним получается, что среди дата сцайентистов ассемблер и вижуал бейсик более популярны, чем кложа. И при этом на каждой кложе-конфе по 5 презенташек от всяких дата-стартапов - что-то тут не сходится, Ватсон.
>>145944
Из тех же данных можно сделать вывод о том, что кложедевелоперы равномерно размазаны по всему миру и получают зарплату на международном уровне сеньоров. Вопрос интерпретации.
И да, я видел в интернетах кложе-стартапы из Азербайджана и автора кложекнижек из Индии, так что тут не все так однозначно.
>равномерно размазаны
Очень сомневаюсь о применимости этих слов к группе людей количеством <300
>и получают зарплату на международном уровне сеньоров
Тогда бы это отразилось в таблицах оплаты по регионам.
Хотя можно преположить, что их отмели по малочисленности
>в интернетах кложе-стартапы из Азербайджана и автора кложекнижек из Индии
У этих-то точно не сеньорского уровня оплата.
>количеством <300
Откуда ты это взял?
>Хотя можно преположить
Я под словом "размазаны" как раз это подразумевал. Тонкой пленкой.
>У этих-то точно не сеньорского уровня оплата.
Почему?
>Откуда ты это взял?
По процентам прикинул от общего числа опрошенных прикинул.
>Тонкой пленкой.
Ты сейчас об энтузиастах или о трудоустройстве? Если второе, то по вакансиям хорошо видно, что пленкой там и не пахнет: один сгусток в США и немного какой-то активности в Британии.
>Почему?
>азербайджанский стартап на хипстерском языке
А ты сам как думаешь? У таких стартапов только один путь к успеху - засветиться на конференции и попасть в контору к белым людям.
>И при этом на каждой кложе-конфе по 5 презенташек от всяких дата-стартапов - что-то тут не сходится, Ватсон.
И вот тут-то как раз всё сходится.
>По процентам прикинул от общего числа опрошенных прикинул.
Ну так это ~300 опрошенных, а не 300 разработчиков, ведь так?
>>145991
>Ты сейчас об энтузиастах или о трудоустройстве?
Я о работе. Они же, насколько я понимаю, опрос про деньги делали среди тех, кто уже работает, а не по открытым вакансиям - так? А это разные вещи.
>У таких стартапов только один путь к успеху
Так, и как из этого следует, что у них там не сеньорская зарплата?
>И вот тут-то как раз всё сходится.
Каким образом?
> А это разные вещи.
Коррелирующие.
>Так, и как из этого следует, что у них там не сеньорская зарплата?
Кто ж им платить-то будет? В лучшем случае к себе завербуют.
>Каким образом?
Таким, что все эти стартапы-презентации за единичными исключениями идут в мусорку.
>Коррелирующие.
Да, пожалуй. Насчет степени этой корреляции мы можем только спекулировать, так что в итоге это все же вопрос интерпретации.
>Кто ж им платить-то будет?
Клиенты, инвесторы. Ну блин, ты всерьез считаешь, что в том же Азербайджане люди живут в аулах, или что? В том же Минске, например, разработчикам же кто-то платит - разница-то не так уж и велика. Про Индию (отдельные ее регионы, энивей) я и вовсе молчу.
>идут в мусорку.
Обычно все-таки на дев-конференциях презентации делают в форме отчета об успешно завершенном\развиваемом проекте.
Вообще, я тебя услышал и согласен с тем, что твоя точка зрения валидна (но не единственна), надо наверное закругляться с оффтопом.
группе людей количеством <300
в кложурианском слаке сидят около 12к человек. в чисто русскоязычном канале over 500
чтобы сделать что-то годное надо быть вынужденным страдать, видимо... в 13-14 годах я троллил es5, с тех пор ежики обкололись, но упоролись до бабеля и молодцы имо. вывод - надо сжечь мавен на компах когнитекта :)
Что-то знакомое. Бля, надо покупать эфир, чому я такой слоупок((
>>147646
Ну он тебе щас ответит, что это типа ЭНТУЗИАСТЫ, а за деньги там 300 человек из 12к работает.
>>147650
Да нет, мавен няшка (если не писать пом вручную). У джавы в этом плане вообще наиболее единственная вменяемая инфраструктура. Просто до того, о чем говорил 2 года назад хикка и что теперь внедряют гуглогоферы, никто как-то раньше не додумался.
Хотя вот вроде бы на поверхности же все лежит, и в смежных областях (веб-апи) этим давно пользуются, и технически все средства уже есть (вопрос соглашений), но - нет, никто не додумался. Как так-то? Вот уж действительно - чтобы сделать что-то годное, надо страдать, тут не поспоришь. Ноу пейн ноу гейн, ех.
с "Поездки на автомобиле бизнес класса" в бонусах обсерунькался в голос
>Никакого legacy кода, приложение разрабатывается с нуля
>Функциональное программирование
>250 000 руб
>Можно удаленно
Боже, благослови Хикку!
>Вакансия Backend java с переходом на Clojure
Вкатывальщики, это ваш шанс, не упустите!
Зачем нужны замыкания, чо эта ваще такое?
Ты промазал тредом, анон.
Тебе в ньюфаг-тред: >>1008826 (OP)
Пока идешь туда, можешь читнуть википедии: https://en.wikipedia.org/wiki/Closure_(computer_programming)
В смысле? Почему? Тоже погуглил - ничего подозрительного не нашел, судя по всему пилят много всяких маркетинговых онлайн-игрушек в браузере.
Так же, где найти третье издание Programming Clojure?
Как её продать для бекенда команде, как основнойя язык для JVM?
1) Жава-обезьяны вообще не поймут.
2) Cкалисты дрочат на типы, считают их понацеей и жить не могут без всякой хуиты типа HKT.
3) Котлинфаги недалеко ушли от жабаприматов, или это и есть бывшие жабовики, которые пытаются пихать свои старые уебанские подходы.
https://github.com/glycerine/zygomys
> Что сейчас считается более стильным (модным, молодёжным), leiningen или boot?
clj а так - lein конечно
>Так же, где найти третье издание Programming Clojure?
В магазине, анон, в магазине.
Ненужно на ненужно и ненужно погоняет!!!11 Лол, на самом деле прикольно, надо глянуть - почему бы и нет.
>>154404
Интересный вопрос. Мне кажется, что как раз джависты из всех перечисленных подходят больше всего. Можно начать с написания тестов (генеративных) для джава-сервисов. На кложе это получается гораздо легче, быстрее и приятнее.
https://github.com/matthiasn/meo
http://matthiasnehlsen.com/blog/2018/03/15/introducing-meo/
Этот же чувак запилил либу для визуализации information flow внутри приложений на его message-oriented распределенном фреймворке. Сам фреймворк я пока не курил, но идея мне нравится: полная интроспекция, распределенность, все в лучших традициях смолтока и лишпов. Интересно, что может получится, если на такое интроспектированное приложение натравить (на живой инстанс!) какой-нибудь машин лернинг. Типа JIT, только для бизнес-логики. Короче, интересно.
https://github.com/matthiasn/systems-toolbox/blob/master/doc/rationale.md
https://github.com/matthiasn/inspect
И напоследок:
https://github.com/cgrand/xforms/ - больше трансдьюсеров, хороших и разных.
https://github.com/HCADatalab/powderkeg - Spark as a transducer. Нет, правда.
> десктоп на электроне
Рак ПО нашего времени.
Кстати, хромэлектрон да ещё и с жвм в обвязке - не жирновато ли для простого журнальчика?
Да на самом деле дохера всего такого на гитхабе, просто его отыскать трудно. Вот помню, что видел чувака, заопенсорсившего с работы какую-то ядреную опердень, и у них там тоже была очень классная мессадж-ориентированная архитектура (документооборот там, хуе-мое). Сразу толком посмотреть как-то не до того было, ну думаю не забуду же. Вот сейчас только вспомнил, лол. Надо взять за привычку все интересное лайкать, короче, а то как-то я к этому не привык.
Ну, я так понимаю электрон он взял, чтобы мобильное приложение на десктопе запускать. Да и там интерфейс хитровыебанный судя по скриншотам. Жвм в обвязке - это сервер. Ну и судя по его блогпосту, это скорее не "простой журнальчик", а что-то типа электронной медкнижки, как у частных терапевтов, напополам с трелло. Он там все пишет: где находится, сколько спит, сколько шагов прошел, какое настроение у него было, скриншоты, закладки, задачи, вообще все. Я даже начинаю подозревать, что это какой-то ебаный киборг.
>I have heard the counterargument a few times that what someone did in their life was so mundane and boring that it would not be worth recording. Well, in that case, they have a much bigger problem…
>> десктоп на электроне
>Рак ПО нашего времени.
два чаю этому, хипсторы со своим жс совсем стыд потеряли
Написал бы на swt или не дай боже swing - точно так же бы ныли, так что все норм. Да и не запилишь ты ни на одном нативном тулките такой гуй, как у него. В итоге один хер поставишь вебвью, ЗАТО НИ ЭЛЕКТРОН!!1
>Написал бы на swt или не дай боже swing - точно так же бы ныли
Разумеется. Джаве нехуй делать на десктопе и в гуй она не умеет совершенно.
Лiл, улыбнулся, спасибо.
>>157346
>>157431
Вы сами-то на кутях писали что-нибудь? Потому что если да, то вы должны представлять, сколько анальной боли причинят попытки (не шибко успешные, мимованга) запилить на них пикрелейтед гуй. Еще раз повторюсь, что все бы закончилось втюхиванием туда вебвьюхи.
Зря лыбишься, на tk большая часть представленного реализуется проще, чем на qml и вебпараше.
Я разработкой на Qt в общей сложности зарабатывал на хлеб 6 лет, и никакой боли там нет. Интерфейс со скрина сделаю легко за отзiв. Боль начинается, когда электроноговно с интерфейсом уровня /b/ жрёт 6 гигабайт RSS.
За то, что я скину сюда референсы с бывшей работы, меня посадят.
Правда, ничего сложного нет - для табов QTabWidget + щепоть QSS, для ввода rich-текста есть QTextEdit с сопутствующими примочками, ебалу с левого края я бы сделал через QTableView с кастомной (разумеется) моделью, список - тривиально через QListView, даже для календаря есть готовый виджет. Работы не больше, чем при реализации на жабаскрипте, зато не будет требовать для своего запуска 64Гб рамы.
Зачем с работы? Скинь любые референсы реализации похожего интерфейса на кутяпках, я подобного вроде не видел.
>для календаря есть готовый виджет
Так я же как бы о том и говорю, что как только выходишь за пределы готовых виджетов, начинается еботня. Есть в кутэ готовый виджет для перетаскиваемых карточек, как в трелло? Какой лайоут у всей этой хуйни в целом будет?
Это зависит. Можно вкатываться во фронтенд, можно в бэкенд, можно в БИГДАТУ с МАШИН ЛЕРНИНГОМ на БЛОКЧЕЙНЕ. Лучше определи свои сильные стороны и цели и пляши от этого, а не от языка. Язык - это инструмент. Он под тебя должен подстраиваться, а не ты под него.
та самая картинка с деньгами и опытом so говорит, что нужно лет over9000 опыта, с другой стороны на апворке свело со шаряшим июнем, для которого кложа была первым языком, но ymmv
ну и в принципе - динамическая типизация, если ты из этого лагеря, то берешь и фигачишь
>та самая картинка с деньгами и опытом so говорит, что нужно лет over9000 опыта
Анон, я тебя поправлю немного. Та картинка как раз говорит, что при сравнительно небольшом опыте получаешь больше, чем в среднем по больнице.
>июнем, для которого кложа была первым языком
Такое вообще законно, лол? Пили кулстори.
Анон, я тебя поправлю немного. Та картинка ничего не показывает. Кложуристов было меньше одного процента от опрошенных (что меньше 300 человек), которые в среднем по больнице работают обычноработу в сша и получают обычноработные 70к. И будь это не так, мы бы имели совершенно другие таблицы.
>при сравнительно небольшом опыте получаешь больше
Никаких ЗНАЙ КЛОЖУ @ УМЕЙ МЕНЬШЕ @ ПОЛУЧАЙ БОЛЬШЕ там нет, не выдумывай.
>>158644
> говорит, что нужно лет over9000 опыта
Это голоса твои говорят, потому что там такого и близко нет.
С кем, блядь, посадили? И это кложуристы? Говно-говно! За весь тред ни слова о программировании.
>Та картинка ничего не показывает.
Лол, ты уже сколько по всей борде носишься и пытаешься это доказать? Get a life, bro.
Я смотрю на график и читаю то, что там написано 10000 respondents, а не фантазирую про 300 человек из США и прочую лабуду. Алсо, специально сейчас открыл: https://insights.stackoverflow.com/survey/2018/#work-salary-and-experience-by-language -
>>158644
Да, анон, вообще-то ты прав, беру свои слова назад. Там 8 лет посередине, а мне почему-то запомнилось, что было что-то в районе 5-6. Так что ты все правильно написал.
http://techblog.telia.no/blog/experience-report-hiring-for-clojure-script-is-easy/
>Our experience shows that hiring people for a Clojure(Script) project is relatively easy (in Oslo, Norway) despite a market where demand exceeds supply. But it is important to use the right channels to reach the right people.
>ты уже сколько по всей борде носишься и пытаешься это доказать?
Второй раз пишу. Первый - чуть выше. ИТТ же больше обсудить нечего.
А ты по целой борде с этой ссылкой носишься?
> а не фантазирую про 300 человек
Найди табличку с количеством использующих и пофантазируй сам.
>из США
В таблицы оплачиваемости языков по регионам. А теперь думай, почему кложуристы не попали ни в одну из таблиц, кроме общемировой.
И вообще, блядь, у нас тут /pr или /hr?
>Второй раз пишу.
Хватит, перестань.
>ИТТ же больше обсудить нечего.
Не заходи сюда. Нажми на кнопочку "-" рядом с номером оп-поста.
>А ты по целой борде с этой ссылкой носишься?
Нет, я ее вообще у другого анона в другом треде увидел.
>Найди табличку с количеством использующих и пофантазируй сам.
Нашел: https://insights.stackoverflow.com/survey/2018/#work-salary-and-experience-by-language
>В таблицы оплачиваемости языков по регионам.
Пикрелейтед.
>почему кложуристы не попали ни в одну из таблиц, кроме общемировой.
Наверное потому что ты таблетки забыл выпить?
>И вообще, блядь, у нас тут /pr или /hr?
Вот именно. Угомонись уже.
Ну ок, за 17й год были совсем другие данные.
>Не заходи сюда.
Нет, я останусь. А вот тебя попрошу съебать в мывамперезвоним-тред.
>Нет, я останусь.
Хорошо, оставайся, но в следующий раз постарайся, пожалуйста, думать и гуглить перед тем, как пытаться развести глупый срач, ок? Тут вам не там все-таки.
А он там живой ещё?
> зато не будет требовать для своего запуска 64Гб рамы
как показывает опыт последних десятков лет - удобство (и в том числе его влияние на качество и скорость) разработки приоритетнее потребляемых ресурсов как на фронтенде так и на бекенде (в разумных границах, все-таки 64 это преувеличение)
В том-то и дело, что смузихлёбы за все разумные границы вылезают. Клиент слака, чят блять, жрёт на моём ноутбуке с 4 гигами рамы 2 гига с хуем, в 5 раз больше, чем моя IDE emacs, по-моему, это пиздец.
Недавно увидел охуенную штуку: http://maria.cloud/
Там прямо с самых-самых азов - не знаю, насколько тебе это подойдет, но попробовать в любом случае стоит, охуенная штука. Ну и шапку читай, ставь лейн, добавляй конфиг фигвила и хуячь туду-лист. Алсо, из фреймворков можешь еще на https://github.com/tonsky/rum посмотреть
Меня тоже слегка выбешивают все эти новомодные чятики, но ты точно не пиздишь, бро? Вот сейчас открыл вкладочку со слаком, не вижу особого потребления памяти, джвач больше жрет.
Спасибо няш.
В браузере оно ещё терпимо, да только речь шла о десктопном клиенте с электроном внутре.
Десктопный слак вроде на электроне. Худший представитель, я бы сказал. Криворукие дебилы просто наговнили там по самые помидоры. Почему виноват не электрон? Потому что vs code тоже на электроне сделана и работает несравнимо лучше, чем слака.
Я и говорю, что фигня какая-то получается: электрон не жрет ну, как..., сайтик слаковский не жрет, а сайтик в электроне - 2 гига. Пиздец безблагодатность какая-то.
Прошёл эту хуйню, придётся теперь устанавливать кложу, чтобы погрузиться в неё с головой. Нахуй ты это сделал, я ведь только смирился с тем, что я тупой ебанат и больше юзерскриптов на жс ничего не смогу в своей жизни.
Кудряшек ещё добавь
Спасибо, анончик. Годнота.
>За весь тред ни слова о программировании.
а давайте, сегодня копаясь в стейте из лог записей со временем захотел получить аналог "grep -n" для списка, чтобы фильтровал нужное, но отдавал мне еще и "контекст" из Х элементов до и после (ну и ессно показывал пересечения контекстов одним куском)
решил, но мне мое решение не нравится если честно, предлагаю анону дать свою версию. не возбраняется и даже любопытно решение на любом языке, единственный важный момент - надо делать в 1 проход, т.е. должно работать на стриме (lazy-seq)
алсо, анон, я свое покажу послезавтра, а пока давай попробуем это сделать красиво, если не лень :)
чтобы не промахнуться я написал на примере натуральных чисел тесты https://ideone.com/Uchszi (благодаря вам еще и генерационные, пинайте)
и да, аноны, баланс выразительности и скорости лучше чем вот это вот http://git.savannah.gnu.org/cgit/grep.git/tree/src/grep.c#n1293
Ну так как n маленькое, можно просто идти окошечком по n×2+1 элементов и проверять средний элемент на соответствие предикату, вроде очевидно.
О, специальная олимпиадка! Что-то давно на программаче не было. Принимайте участника из соседней палаты: http://lpaste.net/532665142584803328
Как раз отличный повод опробовать series. Раньше думал, что это какой-то кусок говна из 90х, очередная библиотека ленивых последовательностей, но сейчас я не просто под впечатлением, я в ахуе. Там внутри полноценный компилятор выражений над потоками данных. Короче, к каждой функции, что обрабатывает серии, в довесок к основному коду, пердолящему танки в рантайме, добавляются метаданные (создается функция-оптимизатор), с помощью которых компилятор потом, когда будут получены все этапы конвейера от источника до назначения, генерирует охуенно эффективный код без промежуточных абстракций, который обрабатывает данные одним проходом. Пример по ссылке.
> Принимайте участника из соседней палаты: http://lpaste.net/532665142584803328
Хуя у вас там сахара. Как вы не путаетесь во всех этих <>#$^% ?
мимокрок-знаю-только-scheme
А чего в них путаться? $^ я сам же в начале определил, % - просто имя переменной, <> - метка подстановки макроса -<>>.
Начиная с 28й строки идет обессахаренный код - результат раскрытия выражения с 23й строки, все # там - uninterned символы.
Сейчас моим основным инструментом является TypeScript + React. Я мог бы перейти на clojure+re-frame, но у меня все и так хорошо работает.
Тесты на JS писать удобно, псевдоиммутабельная функиональщина пишется легко, статическая типизация(+ "as any" где сильно надо) делает рефакторинг легким и безболезненным.
Ради чего мне стоило бы обмазываться скобками?
подход и сгенеренная стейт машина огонь, можешь коротко объяснить, что получилось? и еще момент про (SETF #:OUT-696 (+ 2 2)) - во первых wtf, во вторых почему не заинлайнилось?
по сабжу - выполнил тестовую функцию из примера - получил (0 1 2 3 1109 1110 1111 1112 1113 1111109), насколько я понял, оно что-то недочитывает :) еще например, если нужное в самом конце
p.s. пардон, что в тестовых примерах всегда сортированный уникальный ряд, тут я прокололся, сильно упростив тестовый набор, в жизни конечно на список нет ограничений, в результате надо было (filter f coll) c контекстом
>можешь коротко объяснить, что получилось?
Все элементы пишутся в кольцевой список длиной N + 1 (ключевые строки 39, 70), за счет чего #:SHIFTED (72) отстает от генерируемых чисел #:NUMBERS (54) и флагов #:ITEMS (58-69, 14-17) на N элементов. Нашли подходящий элемент - отсчитываем ещё N + N, а в результирующий список добавляем #:SHIFTED (84-85), если он не nil (75, 19) и если их ещё не больше 10 (80, 25).
>про (SETF #:OUT-696 (+ 2 2)) - во первых wtf
Соответствует setf'у с 16й строки, но с подставленной переменной N.
>во вторых почему не заинлайнилось?
Заинлайнит компилятор.
>выполнил тестовую функцию из примера
Замерил time'ом? :)
>насколько я понял, оно что-то недочитывает
Не, всё правильно. Там же subseries только первые 10 элементов берёт.
>p.s. пардон, что в тестовых примерах всегда сортированный уникальный ряд
Код работает на любых данных. Разве что nil в последовательностях неправильно обрабатывает, но это легко исправимо заменой nil'а на uninterned символ.
Ради Ъ-интеректив девелопмент, ради sound семантики языка, ради нормальной архитектуры, ради иммутабельности, ради внятного асинхронного кода, ради генеративных тестов, ради других платформ, just for fun наконец. А вообще - дело твое, если у тебя возникает вопрос "зачем пробовать не перекатываться, а именно пробовать что-то новое", то может и не нужно оно тебе, зря только время перед монитором потратишь. Каждому свое.
>надо было (filter f coll) c контекстом
Как ты контексты лениво мерджишь одними мапами-фильтрами? Мне в голову только рекурсивное (lazy-seq) решение приходит.
чет да, не убрал subseries, пардон, но все равно, я имел в виду если последовательность кончается раньше (т.е. lookahead получает nil) то оно не учитывается http://lpaste.net/364017
> Замерил time'ом? :)
время офигенно хорошо, даже если я снимаю лимит, зачем он был?
в общем, всех похуй, у меня выходит вот так https://ideone.com/nggjrk
>>161904
>Замерил time'ом? :)
с лимитом и у меня все хорошо ;) а вот если его убрать, оно будет смотреть все до конца и это довольно медленно
кстати, я совсем не в курсе, просто уточнить про ленивость - если эмулировать задержку, как у меня iterate/sleep, то оно отдает элементы лениво, как только очередное окно закрылось, или получилось в 1 проход, но энергично и будет ждать?
>ради генеративных тестов
Могут ли генеративные тесты создавать гарантированно разные значения?
Например, мне нужно написать тест для списка структур вида "[{:id generated-id ...} {:id other-generated-id ...}]" — легко ли сделать так, чтобы generated-id и other-generated-id были случайными, но никогда не совпадали?
(grep-n 1 #{0} (range 1)) должно быть (0)
нашел генерационным тестом, кстати.
ну и как писал выше по треду, на список по идее нет ограничений, так что distinct для удаления дубликации пересечений окон не годится
>(grep-n 1 #{0} (range 1)) должно быть (0)
Схуяли? По одному элементу в каждую сторону. Должен выдавать (0 1), то есть весь список. Чтобы было (0), n должен быть 0.
>distinct для удаления дубликации пересечений окон не годится
Годится, я же строки не просто так нумерую, посмотри внимательнее.
>и это довольно медленно
Да там тормозить-то нечему. Не на sbcl'е запускал что ли?
>>162027
>то оно не учитывается http://lpaste.net/364017
А, точно. Забыл компенсировать сдвиг.
http://lpaste.net/512615483627798528
Ещё заменил nil на #:none.
>>162116
Ленивость есть, subseries как раз для её демонстрации и был добавлялен.
http://lpaste.net/532665142584803328#line80 - в такую проверку он раскрывается.
> строки не просто так нумерую
пардон, да, клевая идея, спасибо!
>(0 1)
(range 1) это же (0). в общем, если контекста не хватает partition скипает https://ideone.com/djTYwk
я добавил хак, чтобы заработало как мне надо
в общем, это идеоматично и мне очень нравится, за исключением того, что это еще медленнее чем у меня (по моим замерам примерно в 1,5 раза, но по сравнению с CL это несущественно). я в шоке от этой вашей series
итого: теперь есть и быстрое решение и идеоматичное. анон, ты торт.
>>и это довольно медленно
>Да там тормозить-то нечему. Не на sbcl'е запускал что ли?
к сожалению для треда, я про кложу, это у нас с другим аноном без лимитов (и если ждать прогон всего range через doall) - все плохо (на порядки)
даже больше, анон, почему вот это https://ideone.com/ijdfeX так медленно?
> там тормозить-то нечему
слушай, а оно прям на любых последовательностях так работает или только series (типа range чисел) и т.д?
анон, я упоролся и улучшил скорость. стало ужасно, императивно, для определенных случаев с контекстом меньше chunk size (32 by default) теперь в 12 раз быстрее https://ideone.com/kLp0pH и вплотную приблизилось к тупому filter на кложе. дальше копаться надо в языке, может попробовать заменить range на LongStream
но блядь эти series все равно в разы быстрее (спасибо, уже не на порядок). это пиздец :)
>IntStream
Может потому что боксинг vs примитивы?
Ну и разница в 5-6 раз для динамики - имхо некритично ¯\_(ツ)_/¯
Если хочется скорости, можешь попробовать чекнуть библиотеку specter (кстати, от того же чувака, что запилил apache storm). Но она скорее как хаскелевские линзы, больше про вложенные структуру, так что не уверен, можно ее сюда впихуть или нет.
Кстати, на трансдьюсерах было уже решение?
> specter
она хорошая, но тут вообще не при чем, у нас тупой filter тормозит
> на трансдьюсерах
применение трансдьюсера не ленивое, оно реализует коллекцию
>>162487
>боксинг
кстати спасибо, теперь наконец-то удалось уложиться с референсным значением итераций и sbcl (100000000) в их лимит, но все же это семечки :)
кстати, ты не то процитировал. jvm норм.
расклад для 100000000 у меня локально (ноут оказывается где-то в 2 раза слабее ideone, такие дела)
- jvm тупой filter 881ms
- clojure тупой filter 8288ms
теперь grep-n
- sbcl - 800ms (WAT)
- clojure (chunked) 8836ms
>(range 1) это же (0).
Что-то я тупанул, да, сори. Короче, предполагается, что n >= длины коллекции, в противном случае нужна твоя пофикшенная реализация, да.
>>162502
>она хорошая, но тут вообще не при чем
Ну он же писал, что реализация стандартных функций быстрее в пару раз. Фильтровать оно умеет из коробки. Но я не бенчил, поэтому и говорю, что не знаю, подойдет ли она для такой задачи.
>применение трансдьюсера не ленивое, оно реализует коллекцию
В смысле? Трансдьюсеры же о коллекциях ничего не знают, их можно хоть на core.async chan повесить и скармливать данные с любой нужной скоростью.
>>162513
>кстати, ты не то процитировал. jvm норм.
В смысле? Я и имел в виду, что джава, возможно, быстрее в том числе из-за того, что ты юзаешь специализированный для примитива класс (IntStream), в то время как в кложе боксинг\анбоксинг.
>- sbcl - 800ms (WAT)
Сбцл очень часто с сишкой тягаться вполне себе может, это да.
я про вот такой эффект https://ideone.com/atYbCE емнип снаружи остановить consume процесс трансдьюсера нельзя, он вычитает все, единственный способ это поменять трансдьюсер и откладывать его применение. наглядно https://ideone.com/atYbCE
>- sbcl - 800ms (WAT)
Это без объявлений типов и (optimize speed (safety 0)) или с?
мимо любопытная варвара
Блин, анон, ты юзаешь transduce, он не ленивый, это как reduce. То есть ты берешь ленивый сиквенс, перегоняешь его через conj в вектор, а потом делаешь take 3 и еще раз перегоняешь результат в вектор. А надо юзать sequence, она ленивая: https://ideone.com/GyM9dU - вычисляется ровно один чанк.
Полностью аналогичная реализация будет такая: https://ideone.com/YDLVT5 (я не знаю, как там зависимости подключать; xforms - это https://github.com/cgrand/xforms/). Но тут filter вычисляет всю последовательность - я не до конца разобрался, почему. Если предикат всегда возвращает true, то вычисляется только один чанк.
Кстати, если уж говорить о ленивости, то (apply concat) в изначальной реализации тоже не ленивый и начнет считать всю последовательность.
Затюнил. На моей микроволновке время исполнения сократилось на ~75%
http://lpaste.net/7412602692305944576
Для тех, кому любопытно, как тюнится общелисп:
Время выполнения без оптимизаций - 7.100
1) Добавил (declaim (inline ?)) - сократилось до 5.080
2) Добавил optimize speed - 4.530
И получаю 5 предупреждений такого вида:
>note: forced to do GENERIC-- (cost 10)
>unable to do inline fixnum arithmetic (cost 1) because: <...>
3) Добавляю (declare (fixnum need)) - 4.350
3 предупреждения из 5 закрыты.
4) Дизассемблирую выражение, бросается в глаза, что одна лямбда не заинлайнилась (http://lpaste.net/532665142584803328 вызывается на 60й строке, #:OUT-704). Хз почему, косяк sbcl'а. С мыслью, что если передать лямбду по имени, то кодогенертрансформатор series'а не будет заталкивать её в переменную, а подставит прямо в место вызова, добавляю flet, sbcl заинлайнил (funcall #'member? X) до нескольких CMP инструкций - 2.420
5) Удаляем проверки типов в рантайме - (safety 0) - 1.800
>2) Добавил optimize speed - 4.530
>3) Добавляю (declare (fixnum need)) - 4.350
Подозрительно маленькая разница. Перезамерил, получилось ~4.9 и ~4.3
Хуй знает, откуда эти 4.530 взялись. Наверное, опечатался при наборе 4.350, а потом записал ещё раз, но уже правильно.
В lein есть какое-то место, куда можно засунуть глобальные алиасы? Хочу repl :headless по lein dev запускать.
kudryashki or gtfo
Свежий минималистичный геттинг стартед для кложескрипта: https://clojurescript.org/guides/quick-start
Заебатый обзор репл-разработки: https://clojure.org/guides/repl/introduction
Дебаг через перенос локального контекста в вары: https://github.com/vvvvalvalval/scope-capture
Браузерный воркспейс с визуализацией данных, прикольная штука: http://gorilla-repl.org/index.html
РИЛТОК про репл-дривен девелопмент от бати: https://vimeo.com/223309989
Спасибо няш.
Что значит "очистить cider"? Сидер - это пакет, который добавляет в имакс ide для кложи. Тебе репл нужно очистить, или что? C-c C-o удаляет последний вывод, в меню есть Clear buffer для очистки всего буфера.
Как лучше назвать? Может xf-> ?
http://www.orcpub.com/
https://www.orcpub2.com/
Автор обещает скоро заопенсорсить и looking for contributors.
только не теорию категорий
бамп вопросу
>функции первого порядка,
Есть first-class functions, есть higher-order functions. Ты точно все понял? :3
Вопрос не очень понятен - тебе теория нужна? Или что-то про фп в кложе, раз ты тут вопрос задаешь? Если первое - читни "введение в функциональное программирование" харрисона, например. Ну и всякую классику - tapl, dcpl, pfpl, hott...
>tapl
>the core topics include untyped lambda-calculus, simple type system, type reconstruction, polymorphism ...etc
Не то.
>dcpl
>this book explore a set of programming language design dimensions like dynamic semantics(naming, state, data), static semantics(types, type reconstruction, polymorphism), pragmatics (compilation, gc)
Не то.
>pfpl
>this text develops a comprehensive theory of programming languages based on type systems and structural operation semantics.
Не то.
>hott
>только не теорию категорий
>homotype type theory
лол.
>harrison
>lambda calculus
>types
>ml
>details of ml
>effective ml
Эту книжку гляну, но оглавление не впечатлило.
>не понятен вопрос
Мне нужны advanced материалы по фп. Не по теории категорий, не по cs, а именно по функциональной парадигме. Ещё что нибудь есть, няш?
Анон, судя по этому посту, ты сам не очень понимаешь, что такое "фп" и что именно тебе нужно. Ты фактически пишешь: "хочу материалов по функциональному программированию, только чтоб без функционального программирования". Ну окасаки почитай, например. Пока не сформулируешь вопрос конкретно, я тебе помочь не смогу.
Ну так я тебе и не давал ничего по теории категорий - ну, разве что hott ее задевает. Еще раз прошу сформулировать твои цели и твой запрос, ну и что ты понимаешь под "фп" заодно.
Кстати, если окасаки прочитал, вспомнилась еще книжка "Pearls of Functional Algorithm Design" - мозгоебля, на любителя. Ну и я предполагаю, что стандартные sicp+htdp ты уже прочитал?
>>165547
Ну ты просишь книжку про ооп - тебе советуют мануал по смолтоку. Логично!
В пакете карп, в пакете. Меня вот сразу смущает как он может без мануального управления памятью (инб4: кожанные ублюдки тоже косячат), когда даже в расте иногда нужно делать грязные хаки, типа forget или drop.
Сразу скажу, что я шибко не разбирался (гайд и введение прочитал, змейку еще не смотрел), но мне кажется, что там дофига ограничений должно получаться. По сути, там же такие правила (поправь, если где-то не прав):
1. В конце лет-блока дропаем все, что плохо лежит.
2. Возвращать реф из лет-блока нельзя.
3. Овнершип передается с аргументами.
4. Структуры дропают свой контент при дропе.
5. ???
6. ПРОФИТ!
Насколько я понимаю, нет сумтайпов, нет рид-онли рефов, нет лайфтаймов, нет полиморфизма (хотя definterface вроде есть, но в пример с ним я не врубился), любые опасные операции подразумевают копирование. Плюс я так понимаю списки\массивы у него в рантайме заделаны, а не на самом языке. Короче, надо посмотреть внимательнее.
https://gist.github.com/mfikes/e00202b2de7cc2352fedcf92b1fe60dc
https://gist.github.com/seancorfield/6e8dd10799e9cc7527da5510c739e52f
Лучшее что изобрели для десктоп-приложений на Clojure и вообще, никакие электроны рядом не валялись. JavaFX быстрая, портабельная, с аппаратной растеризацией и вменяемым подмножеством CSS для управления внешним видом UI
>JavaFX быстрая
>Java
>быстрая
Srsly tho, не шутишь? Жавафх же вроде какая-то невзлетевшая хуита. К тому же она мне никак не поможет, если я хочу нативный лук-енд-фил, так?
мимо-когда-то-писал-да-недописал-враппер-для-свт
За что ж ты так пользователей не любишь? Им и так с браузерами досталось.
>Srsly tho
Не знаю как там в 2005 но на нынешнем железе работает быстро. А натив лук уже почти никому и не всрался, поскольку все привыкли к веб/материал дезинг/электрон и прочей андокументед алиен хуете
>свт
в JavaFX наконец отказались от идеи использовать натив-виджеты что и позволило сделать всё более или менее прямо и быстро ко второй версии
>>168062
>За что ж ты так пользователей не любишь? Им и так с браузерами досталось.
В том то и дело что нынче JavaFX работает лучше любого броузер-UI
>но на нынешнем железе работает быстро.
>А натив лук уже почти никому и не всрался
Сука, как же я ненавижу таких мудаков! Все бы им скобочки дрочить себе на потеху, а на пользователей класть. НАХУЙ ИЗ ПРОФЕССИИ.
>поскольку все привыкли к веб/материал дезинг/электрон и прочей андокументед алиен хуете
Кто привыкли? Кто, блядь? 1% пользователей хромобука?
>В том то и дело что нынче JavaFX работает лучше любого броузер-UI
Нашел с чем сравнивать.
>а на пользователей класть
пользователи которым прямо жизненно необходим натив-лук (который кстати из примерно 10 натив-луков windows или linux?) скоро уже вымрут вместе с тобой старикашка
>Кто, блядь?
Например все у кого есть в кармане андроид или хотябы одно приложение на базе электрона
>который кстати из примерно 10 натив-луков windows или linux?
Каких 10ти? В щиндовсе нет выбора, а на линуксе живы только гтк/куте, которые, к счастью, научились выглядеть одинаково.
>скоро уже вымрут вместе с тобой старикашка
Не дождешься.
>Например все у кого есть в кармане андроид или хотябы одно приложение на базе электрона
Ни одного. ЧЯДНТ?
>Каких 10ти? В щиндовсе
Ну допустим не из 10 а из двух, всё равно ты уже вряд ли сможешь иметь THE native look если их два
Троллинг асайд идея была в том что упомянутый выше fn-fx это возможность делать нормальные быстрые UI в функциональном react-стиле не вылезая из кложурки и не сношаясь с win32 или электроном. Если вам прям обязательно необходима боль и кнопочки '99 стайл, пожалуйста но не надо блять за всех отвечать впрочем нас видимо тут только двое и есть
Так, смотри. Все приложения делятся на два типа: нативные и ненативные. Для нативных используется гтк, кутэ или винформс. Для ненативных - в основном веб.
Я не понимаю, какую нишу заполняет жавафх. Если мне нужно кроссплатформенное ненативное приложение, то я чтмлцссхуйпиздаговно, чтобы его можно было выставить в интернеты. Если мне нужно нативное приложение, то мне нужен и нативный лук - иначе см. пункт первый. Жавафх же - это такой типа веб, но только без веба. В итоге имеем все недостатки и первого, и второго подходов, без преимуществ и первого, и второго. Не понимат. ЧЯДНТ?
>ты уже вряд ли сможешь иметь THE native look если их два
Настраиваемых. К тому же, ты упускаешь, что родным приложение определяется не только по виду, но и поведению, интегрируемости в среду.
>Троллинг асайд
Вось шо гэта за грязний рунглиш? Тутай тябе не у своем ковхозе, пяши як нармальны адукованы чалавек.
>делать нормальные быстрые UI
Один лишь старт жвм занимает от 10 секунд, а ведь ей ещё прогреться нужно. О какой быстроте ты говоришь?
>функциональном react-стиле не вылезая из кложурки
Вот об этом я и говорю. Срал ты и подобная тебе хипстота на результат, лишь бы модными скобочками поиграться.
>и не сношаясь с win32 или электроном
С винапи не нужно было сношаться ещё до твоего рождения.
>Если вам прям обязательно необходима боль и кнопочки '99 стайл
Ты прав, единобразие в интерфейсах - слишком скучно и вообще застой и ретроградство. Долой эту серость! Интерфейс должен быть неповторимым, современным! Покажи им всем своё творческое Я! Думай иначе!
Ну вообще-то конкретно в этом он прав, ты какой-то слоупок или жирный. Все уже давно привыкли к мобилкам с вебом, как раз нативлук-приложения нужны 1% пользователей (мне в том числе).
Ну и в любом случае, я думаю в рамках этого треда и обсуждения гуи на жвм в любом случае подразумевается, что речь идет об динамических оперденях, эндюзеры которых, скажем так, сильно отличаются от среднего посетителя этой доски.
>>168120
>которые, к счастью, научились выглядеть одинаково.
Это пиздеж, кстати.
>>168107
>который кстати из примерно 10 натив-луков windows или linux?
Тоже пиздеж, 3 штуки. На самом деле 2 (винформс и гтк).
>Один лишь старт жвм занимает от 10 секунд
В голос проиграл. Ты реально какой-то поехавший, хоть и конкретно в этой дискуссии моя точка зрения практически совпадает с твоей.
>Ну вообще-то конкретно в этом он прав, ты какой-то слоупок или жирный.
>Все уже давно привыкли к мобилкам
В экосистемах которых как раз таки наоборот при проектирования интерфейсов принято следовать четким руководствам платформы.
>эндюзеры
Та вы хлопцы чи с одного ковхозу будете?
>Это пиздеж, кстати.
https://wiki.archlinux.org/index.php/Uniform_look_for_Qt_and_GTK_applications
>>168166
Ну уж не обессудьте, не успел обновиться до последнего СЕРДЦЕВИНА Я7, дабы не мешать ребятам играться скобочкамидвигать прогресс.
ты вот например в чём на кложуре пишешь, в intellij или в емаксе? который из них имеет нативный лук?
Не уловил. Что в8 какой-нибудь, что жвм - не вижу особой разницы. Жс вмы даже лучше для пользователя, например. Да и с точки зрения кложеразработчика жс по семантике чуть ближе по идее. Или что ты имел в виду?
>>168186
Чувак, ну ты правда несешь что-то эдакое, лучше я не буду тебе отвечать, не обессудь.
>>168188
Ну вот это хороший поинт, да - туше. С другой стороны, можно аргументировать, что имакс - сам себе среда, и все программы для имакса имеют нативный имаксовый лук.
Ну и вообще, иде (фотошоп, 3дсмакс, автокад, етк) - это такая штука, с ненативностью которой все-таки можно мириться.
Хотя я сейчас так прикинул и понял, что каждое из основных моих частоиспользуемых приложений имеет свой лукэндфил. Сука.
>Не уловил. Что в8 какой-нибудь, что жвм
Кложаскрипт не пытается изолировать меня от джавыскрипта полностью спасибо Рич, соответственно с ними так или иначе приходится иметь дело. А Java/JVM/экосистема всё же ощутимо более вменяемо устроены чем аналоги из мира JS
Поясните лучше за эти ваши трансдьюсеры-хуюсеры.
Зачем это так назвается?
Почему об этой хуете ни слова нет в моей The Joy Of Clojure SE?
Нахуя плодить лишние сущности?
В чём принципиальная разница с обычной каррированной функцией?
Нахуй иди, сынок.
Я уже сам всё выяснил.
Как я и думал - это хуета.
The reason transducers were added to Clojure is that with the addition or core.async channels, Rich Hickey and friends found themselves reimplimenting all of the stanard collection functions to work with channels (map, filter, take, etc.). RH wondered if there wasn't a better way here, and went to work thinking about how to decomplect the logic of these various collection processing functions from the mechanics of the collection types at hand.
Лисп такой лисп, лол.
Главное, щи посложнее сделать.
Тансдьюсеры-хуюсеры, всё как у взрослых.
>Я уже сам всё выяснил.
Молодчинка :3
Только из твоего поста ясно, что ты ничего не выяснил, лол. Если таки захочешь выяснить - наверни классику, "A tutorial on the universality and expressiveness of fold" (Hutton) и https://clojure.org/reference/transducers или https://www.youtube.com/watch?v=6mTbuzafcII
tl;dr: трансдьюсеры - это комбинаторы редьюсеров.
Щи сложные делать не надо - все давно придумано, но до риалворлда доходит в лучшем случае тысячная часть этот всего.
Вот именно, что фолд.
А тут изобретают велосипеды и хуйню всякую колхозят налету, выдавая за охуенные открытия с мудрёными названиями.
>how to decomplect the logic of these various collection processing functions from the mechanics of the collection types
Ну охуеть просто.
Так они, глядишь, скоро и монады какие-нибудь изобретут.
И придётся срочно 4-е издание Programming Clojure делать.
Динамично развивающийся язык же.
Особенно забавно было наблюдать, как несколько лет везде писали, что ооп нету в кложуре потому, что это некультурно - иметь ооп в охуенно функциональном языке без фолда.
А потом - опа - и ооп наш новый лучший друг.
Хипстеры, одно слово.
Анон, извини, но ты несешь какую-то херню, совершенно не разобравшись в вопросе. Еще раз предлагаю прочитать тебе указанные выше пейпер и статью, потому что ты не понимаешь, о чем говоришь. Если после этого останутся вопросы - приходи, обсудим. Для подобных срачей можешь создать отдельный тред, если хочешь.
>А тут изобретают велосипеды и хуйню всякую колхозят налету
Эта хуйня была изобретена уже в 1989 при разработке упоминавшегося ИТТ общелисповского series.
Естественно, в сериес не те же самые трансдьюсеры, но назначение то же - избавиться от создания промежуточных последовательностей.
Хотя очень возможно, что и почти те же. Нужно бы посмотреть, как оно жонглирует лямдбами, когда не удалось преобразовать в единый цикл.
Ну тогда уж давайте теперь вообще все, что хотя бы отдаленно связано с map fusion, называть трансдьюсерами)) и говорить, что эта хуйня была уже изобретена в 19xx году))0) Хотя подожди, это слабовато, можно же сказать, что любой реролл рекурсии в цикл - эт то же самое, цель же в избавлении от промежуточного мусора. Короче, давайте условимся, что трансдьюсеры были введены в промышленную разработку в 1958 году, самим батюшкой Маккарти. Ну, чтоб уж наверняка - чего мелочиться-то? /rant
Ну а если серьезно, давайте не будем хуйней страдать, а? У одного трансдьюсеры - это каррированный фолд с ооп (шта), у другого - все методы оптимизации итерации по последовательности эт примерно одно и то же. Ну блин, давайте демагогией в каком-нибудь мывамперезвоним-треде все-таки заниматься, а не здесь.
Сириес - это дсл на макросах, который переписывает функциональные трансформации в мутабельный луп. Какое тут "почти те же" может быть? У хикки же есть все ссылки на пейперы, по мотивам которых он либу пилил, - не понимаю, зачем тут что-то выдумывать, а?
Похоже ты не понял. Сам термин "трансдьюсер" можно найти в литературе за 1989.
Если бы знал, что это ТАК заденет твои религиозные чувства, то, пожалуй, не писал бы.
>>169292
>Сириес - это дсл на макросах
Не совсем так. В сериес все трансдьюсеры - обычные функции (но с пометкой и функцией-оптимизатором в метаданных). Так вот, если все ступени конвейера определить в момент компиляции не удаётся, то никаких преобразований кода не производится: трандьюсеры честно вызываются, ебутся лямбды в рантайме, вот это вот всё. Как именно - не изучал.
>Сам термин "трансдьюсер" можно найти в литературе за 1989.
Гхм. Ну сам термин "трансдьюсер" можно вообще наверное в литературе чуть ли 19-го века найти: https://en.wikipedia.org/wiki/Transducer
>если все ступени конвейера определить в момент компиляции не удаётся, то никаких преобразований кода не производится
Хм, да? А накидай примеров, если не лень. Я только блогпост про них читал, так что тоже особо не изучал, как оно все работает.
Никто так и не смог дать _внятных_ объяснений, чем это _принципиально_ отличается фолда.
Так бывает в тех случаях, когда спрашиваемый сам не понимает, и просто дрочит на чей-то авторитет.
Предложения "почитать" - не катят.
Я почитал, и итогом этих чтений стал пост >>168924
И вообще, эта ваша кложура в целом очень напоминает известную историю про новое платье короля.
>Предложения "почитать" - не катят.
Лол, вся суть мамкиных вкатывальщиков и прочих формошлепов. Раз ты не можешь прочитать и понять одну страницу документации дай угадаю: английский еще не выучил, да?)), то тебе попросту не место в этой профессии. До свидания.
Для остальных, просто чтобы показать всю степень идиотизма этого анона, который не можешь отличить трансдьюсер от fold: фолд имеет тип (a b -> a), a, -> a; трансдьюсеры имеют тип вида (a b -> a) -> (a c -> a), в котором списки (или foldable в общем случае) вообще никак не упоминаются.
Алсо, монады в кложе были чуть ли не с самого начала (https://github.com/clojure/algo.monads), но в динамическом языке от монад самих по себе, как нетрудно догадаться, особой пользы нет - вангую, что это чучело просто крутое слово)) услышало, но разобраться в них, как и в трансдьюсерах, не осилило.
>фолд имеет тип (a b -> a), a, List<a> -> a
Лол, еще один быстрофикс - List<b>, нувыпонели.
Чувак, ты ещё раз продемонстрировал, что ты не особо далёкий паренёк.
И у тебя очевидные проблемы с пониманием обобщений, аллегорий и т.п.
Возможно, это просто в силу юного возраста.
Это также объясняет твой максимализм и то, что ты сразу начинаешь гнать в ответ на любое мнение, отличное от твоего.
Вот годная инфа (откуда и была взята цитата выше):
https://stackoverflow.com/questions/27816946/what-are-the-similarities-and-differences-between-scala-transducers-and-clojure
Примерно таких объяснений я и хотел.
Бла-бла-бла, опять обидки, вода и ничего по теме треда. Если у тебя есть менее идиотские вопросы - задавай, в противном случае - иди читай документацию, до свидания.
>Ну сам термин "трансдьюсер" можно вообще наверное в литературе чуть ли 19-го века найти
Но те трансдюсеры не про обработку последовательностей без создания промежуточных. Вообще, вполне возможно, что хикка вдохновлялся сериесами, он же, кажется, общелиспером был.
>А накидай примеров, если не лень.
Ну, самому писать мне лениво. Можешь в cltl2 посмотреть, там есть небольшие: http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node347.html
Ну, если бы он ими вдохновлялся, то в референсах бы поставил на них ссылку, а он явно проговаривал, что вдохновлялся другим. А как раз из-за его темного общелиспового прошлого видится маловероятным, что он про сириес не в курсе. Ну, впрочем хуй знает, но все равно это не важно - трансдьюсеры вообще не про обработку последовательностей без создания промежуточных результатов, блин.
>Можешь в cltl2 посмотреть, там есть небольшие
Я имел в виду конкретно примеров, когда "никаких преобразований кода не производится".
>Я имел в виду конкретно примеров, когда "никаких преобразований кода не производится".
А, ты про это. Да просто запусти любой из примеров без коллекта и оно тебе foundation-series объект вернет.
Не. Я про разворачивание в луп. В книжке пишут, что оно не разворачивает в луп, если детектит сайд-эффекты внутри.
А, это... я думал, ты хочешь посмотреть как неоптимизированная версия работает.
Transducers improve efficiency, and allow you to write efficient code in a more modular way.
Compared to composing calls to the old map, filter, reduce etc. you get better performance because you don't need to build intermediate collections between each step, and repeatedly walk those collections.
Compared to reducers, or manually composing all your operations into a single expression, you get easier to use abstractions, better modularity and reuse of processing functions.
https://stackoverflow.com/questions/26317325/can-someone-explain-clojure-transducers-to-me-in-simple-terms
При этом, копая эту тему, я узнал массу интересных вещей, к кложуре отношения вообще не имеющих.
И да, речь шла не о том, как пользоваться трансдьюсерами и т.п., а о самой сути этой идеи - т.е. _зачем_, и что не так с другими вариантами. В официальной документации это не отражено вообще.
>ни в чём, как я и думал
Лол, шли третьи сутки, боец все еще считал трансдьюсеры фолдом а стулья - цементом.
>При этом, копая эту тему, я узнал массу интересных вещей
Это вообще характерная черта сабжа. А если ты вместо нытья и щитпостинга будешь задавать вопросы и читать ответы, которые тебе дают, то ты вообще охуеешь от того, сколько оказывается узнать можно (не только в этом треде, а хоть где).
>В официальной документации это не отражено вообще.
А, да, и если еще английский подучишь, блядь:
https://clojure.org/reference/transducers
Transducers are composable algorithmic transformations. They are independent from the context of their input and output sources and specify only the essence of the transformation in terms of an individual element. Because transducers are decoupled from input or output sources, they can be used in many different processes - collections, streams, channels, observables, etc. Transducers compose directly, without awareness of input or creation of intermediate aggregates.
Also see the introductory blog post and this video.
Можешь привести годный пример решения некоей реальной задачи на Clojure, которое было бы однозначно лучше решения той же задачи на Scala, например?
С пояснениями - почему. как и т.д.?
Не обижайся, анончик, но по-моему это какая-то хуевая постановка вопроса, не имеющая никакого смысла. Мало того, что получается один и тот же проект должен быть два раза написан, причем именно на скале и кложе, так еще и непонятно, как ты собираешься мерять, какой из них "лучше" - по количеству строчек кода, лол? Ну тогда кложа будет однозначно "лучше", лол, но это же нихуя не показатель.
А так, ну, хуй знает, вот например core.async - реальная задача, добавление асинхронности в язык, но при этом сделано чисто библиотекой, без модификации самого языка. На скалке такого тупо не сделаешь, так что получается "однозначно лучше".
Или любая фулстак вебня или просто спа - можно использовать кложу и на сервере, и на клиенте, а скалки на клиенте по факту нет скала.жс - это игрушки, так что тоже однозначно лучше.
А для всех задач, которые в принципе реализуемы на обоих языках, значение "лучше" зависит в первую очередь от того, какая команда будет заниматься их реализацией, имхо. Ну ладно, еще тесты и всякий дата-процессинг на кложе однозначно удобнее.
нет но в целом разница между clojure и scala состоит в том что первая специально максимально возможно простая чтобы не занимать собой все 20 ватт TDP твоего мозга и оставить что-то на решаемую задачу кто и зачем придумал scala я не знаю, но они явно из другого биологического вида
Я полностью согласен с твоей характеристикой скалы.
Но, насчёт кложуры - тут не всё так однозначно.
Сложные вещи быстро становятся нечитаемыми, ибо лисп же.
И эта тугая струя мелких функций и макросов на каждый пук, буквально.
И, чтобы нормально во всём этом ориентироваться, тоже приходится грузить тоже хуеву тучу мозговых ресурсов. Просто грузятся они немного иначе.
И очень тяжело читать даже свой собственный, не особо сложный код, спустя несколько месяцев.
>Сложные вещи быстро становятся нечитаемыми, ибо лисп же.
Щито? Поясни за базар.
>И эта тугая струя мелких функций и макросов на каждый пук
А что, ты собираешься без функций писать код? Не понел.
>И очень тяжело читать даже свой собственный, не особо сложный код, спустя несколько месяцев.
Ты точно уверен, что проблема тут в языке, на котором ты пишешь?
Зарепортил щитпостинг.
От сложности никуда не спрятаться, однако в кложуре спасибо Рич максимум усилий приложен для того чтобы уменьшить количество связей между компонентами (поскольку именно в них как правило и содержится максимальное её количество).
Например: pure функции/immutable данные (чтобы понять функцию тебе достаточно её самой плюс корректность многопоточных вычислений становится хотя бы теоретически возможной), предпочитание библиотек фреймворкам и т.п. Макросы как необходимое зло используются точно по необходимости
Всё это, насколько я могу видеть, сделано в первую очередь именно для уменьшения нагрузки на мозг (ну т.е. взяли common lisp, снизили упомянутыми выше путями нагрузку на мозг, прикрутили jvm чтобы не ебаться с библиотеками и c ffi и получили кложуру)
>кложу и на сервере, и на клиенте
не понял, на клиенте кложу? на фронте только жс же, поясни-ка
так и думал, что это типа тайпскрипта. На выходе всё равно жс, так что называть это кложей не совсем уместно.
Хоть кресты компилируй в жс, всё равно браузеры только жс читают на клиенте
Ага, а на сервере у тебя только процессор, поэтому всё равно в итоге только машинный код. Хуйни не неси.
>На выходе всё равно жс, так что называть это кложей не совсем уместно.
Наркоман? По такой логике обычную кложу следует называть "байткодом jvm" ну или машинным кодом, как анон выше справедливо заметил.
>>>1172696
>>Сложные вещи быстро становятся нечитаемыми, ибо лисп же.
>Щито? Поясни за базар.
я не тот анон и более того, уже года 4 с переменной частотой пишу на кложе. и знаешь, да, бывают моменты стыда
например, начинается уже когда начинаешь писать вместе map+update-in без specter (или схемы)
и хз то ли лучше прям внутри функции, с названием из бизнес логики херачить лапшу в длинных let блоках с кучей биндингов, то ли сделать фукцию с уебищным названием типа cast-field-to-x-in-relation-of, которая ну вообще ни разу не будет переиспользована.
А лисп-то тут при чем? Как бы в любом языке для обработки сложной deeply-nested структуры придется писать код для, ээ, для обработки этой сложной deeply-nested структуры. Тут хотя бы спектер есть, да.
>которая ну вообще ни разу не будет переиспользована.
Какое отношение переиспользование имеет к разбиению кода на логические блоки? Не надо нам тут вот этого, а то щас понабежит эффективный менеджер из мывамперезвоним треда и начнет залечивать про то, что НИЗЗЯ код в отдельную функцию выносить, пока она тебе ТРИ РАЗА не понадобится (и перекреститься еще, ага), а до этого надо все в одной функции на полтора экрана писать
>обработки сложной deeply-nested структуры
мне кажется отличительный сигнал это вообще сигнатура T -> T т.е. тот же тип с другими кишками.
например хеши: вот если забыть о спектре. у нас на каждый уровень из hashmap при сборке "обратно" после итерации будет into или пр. как с куста, но это же лишнее для понимания цели функции, машинерия. а если бы были пуристами, то и mapv бы не было, и могли бы с векторами тоже хапнуть. существование спектра по-моему уже камень в огород core
> Какое отношение переиспользование имеет к разбиению кода на логические блоки
дело в единицах смыслов, которыми оперируешь в голове, когда читаешь. в кложе у меня пока получается либо акронимы действиям, либо в голову лезут мелкогранулярные, низкоплотные update-map-into. право, не макросить же их для семантики.
согласен, не очень про язык, просто наболело). пока есть план писать ns которые аля классы, где функции первым параметром принимают инстанс (привет питон). т.е. поведение все равно липнет к структурам, выходит ооп, но если не группировать так, а делать proxy или раскидывать update-map-into то в коде как будто слов много, а смысла мало.
>сигнатура T -> T т.е. тот же тип с другими кишками.
Ну как бы строго говоря в динамически-типизированном языке все функции имеют такой тип. Тут все зависит от гранулярности, с которой ты хочешь на это смотреть. Ты же не думаешь о логическом типе своих функций как о "хэшмап в хэшмап", у тебя это какая-то конкретная структура, зависящая от того, что ты внутри акцессишь (ликвид рекорд).
>у нас на каждый уровень из hashmap при сборке "обратно" после итерации будет into
Не совсем понял, при итерации чего? Хэшмапа? Это же редко бывает, и обычно хватает map-vals\map-keys. Можешь привести пример с инто, который ты имел в виду?
>это же лишнее для понимания цели функции, машинерия
Почему лишнее? Если ты используешь инто, то ты явно говоришь, что результат итерации хочешь собрать, например, в вектор. Если у тебя функция на порядок более высокого уровня, но она и не должна зависеть от деталей потока выполнения (например, ленивый итератор мы возвращаем или реализуем все в вектор). Если она от этого зависит, значит концептуально у тебя абстракция протекает, и, следовательно, эта функция на самом деле вовсе не такая "высокоуровневая", как тебе кажется. Причем "высокоуровневый" я употребляю не в смысле "хороший", а в смысле относительно операций с хэшмапами и коллекциями - и не всегда это нужно или хорошо, обычно как раз лучше думать об объектах домейна как об обычных данных.
>существование спектра по-моему уже камень в огород core
Ну хуй знает. По-моему любой практично мыслящий человек понимает, что если бы, допустим, вместо коре был бы спектер с самого начала, то точно так же сейчас бы кто-нибудь писал про другую либу Х, что существование X уже камень в огород (гипотетического спектер-)коре. Лучшее - враг хорошего. Алсо, я вот не могу сказать, что спектер однозначно предпочтительнее - для некоторых случаев он удобнее, да, но не более того.
>право, не макросить же их для семантики
Ну макросы тут как-то вообще не в тему, все эти трансформации (хоть обычные, хоть трансдьюсерами) композируются обычной композицией функций. Опять же - приведи пример, что ли. Если что, ничего плохого нет в том, чтобы думать в терминах преобразований данных.
>т.е. поведение все равно липнет к структурам, выходит ооп, но если не группировать так, а делать proxy или раскидывать update-map-into то в коде как будто слов много, а смысла мало
Честно говоря, вообще не понял, при чем тут proxy, как связана группировка кода по неймспейсам и update-map-into, и почему смысла в коде мало. По поводу группировки кода - component\integrant де-факто стандартный путь. По поводу разбиения на функции - у того же weavejester'а глянь код, например. По поводу ооп - смысл ооп в привязке состояния к функциям, а у тебя никакого состояния у функций нет (надеюсь). Алсо, никто не запрещает тебе принимать инстанс не только первым, но и вторым параметром, например (ну, если только ты не компонентный фанатик, лол).
А вообще, серьезно, если у тебя есть код, который ты можешь расшарить - вкинь, будет интересно посмотреть, какие именно места тебе не нравятся, и попробовать что-нибудь сделать.
>сигнатура T -> T т.е. тот же тип с другими кишками.
Ну как бы строго говоря в динамически-типизированном языке все функции имеют такой тип. Тут все зависит от гранулярности, с которой ты хочешь на это смотреть. Ты же не думаешь о логическом типе своих функций как о "хэшмап в хэшмап", у тебя это какая-то конкретная структура, зависящая от того, что ты внутри акцессишь (ликвид рекорд).
>у нас на каждый уровень из hashmap при сборке "обратно" после итерации будет into
Не совсем понял, при итерации чего? Хэшмапа? Это же редко бывает, и обычно хватает map-vals\map-keys. Можешь привести пример с инто, который ты имел в виду?
>это же лишнее для понимания цели функции, машинерия
Почему лишнее? Если ты используешь инто, то ты явно говоришь, что результат итерации хочешь собрать, например, в вектор. Если у тебя функция на порядок более высокого уровня, но она и не должна зависеть от деталей потока выполнения (например, ленивый итератор мы возвращаем или реализуем все в вектор). Если она от этого зависит, значит концептуально у тебя абстракция протекает, и, следовательно, эта функция на самом деле вовсе не такая "высокоуровневая", как тебе кажется. Причем "высокоуровневый" я употребляю не в смысле "хороший", а в смысле относительно операций с хэшмапами и коллекциями - и не всегда это нужно или хорошо, обычно как раз лучше думать об объектах домейна как об обычных данных.
>существование спектра по-моему уже камень в огород core
Ну хуй знает. По-моему любой практично мыслящий человек понимает, что если бы, допустим, вместо коре был бы спектер с самого начала, то точно так же сейчас бы кто-нибудь писал про другую либу Х, что существование X уже камень в огород (гипотетического спектер-)коре. Лучшее - враг хорошего. Алсо, я вот не могу сказать, что спектер однозначно предпочтительнее - для некоторых случаев он удобнее, да, но не более того.
>право, не макросить же их для семантики
Ну макросы тут как-то вообще не в тему, все эти трансформации (хоть обычные, хоть трансдьюсерами) композируются обычной композицией функций. Опять же - приведи пример, что ли. Если что, ничего плохого нет в том, чтобы думать в терминах преобразований данных.
>т.е. поведение все равно липнет к структурам, выходит ооп, но если не группировать так, а делать proxy или раскидывать update-map-into то в коде как будто слов много, а смысла мало
Честно говоря, вообще не понял, при чем тут proxy, как связана группировка кода по неймспейсам и update-map-into, и почему смысла в коде мало. По поводу группировки кода - component\integrant де-факто стандартный путь. По поводу разбиения на функции - у того же weavejester'а глянь код, например. По поводу ооп - смысл ооп в привязке состояния к функциям, а у тебя никакого состояния у функций нет (надеюсь). Алсо, никто не запрещает тебе принимать инстанс не только первым, но и вторым параметром, например (ну, если только ты не компонентный фанатик, лол).
А вообще, серьезно, если у тебя есть код, который ты можешь расшарить - вкинь, будет интересно посмотреть, какие именно места тебе не нравятся, и попробовать что-нибудь сделать.
А ты команду ищешь?
Следующий же релиз будет LTS, нафига вообще о десятке беспокоиться? Считай это бета-версия.
Я пытался какое-то время назад перевести один проект с 8 на 9, так ничего не вышло, хотел узнать как обстановка изменилась с тех пор я конечно остался таким же криворуким а так-то можно и 11 подождать
В лейн емнип какое-то время был баг, связанный с девяткой, но вроде все уже давно починено.
Просто я начал изучать CL и он мне понравился, но он не актуален. Клоджур - это просто альтернатива JS? Или он может все тоже, что и CL. Как он чувствует себя в ML и макросах?
tl;dr:
Бля. tl;dr:
>— Обязательно знать джаву и жс?
>На уровне чтения документации.
Вообще говоря, если ты изучаешь сабж, то предполагается, что ты уже умеешь программировать (то есть можешь читать\писать код на любом из мейнстримных языков). Изучать джаву не нужно, если под "изучением джавы" ты подразумеваешь спринг-хуинг и прочие хибернейты. Изучать нужно платформу. Если ты пишешь под андроид, то тебе, очевидно, придется изучить андроид сдк. Если ты пишешь под веб, то тебе, очевидно, придется изучить чтмл+цсс и веб апи. Если ты пишешь под жвм... ну, ты уловил закономерность, да?
> Как он чувствует себя в ML и макросах?
Не понял вопроса.
Макросы в кложе негигиенические, такие же как в кл, но удобнее благодаря синтаксису для автоквалификации существующих и автогенерации новых имен.
По машин лернингу смотри здесь:
https://github.com/josephmisiti/awesome-machine-learning#clojure
и здесь:
https://github.com/originrose/cortex
и здесь:
google.com/?q=clojure+machine+learning
Алсо, есть книжки по сабжу. Алсо, начать можешь с видосика: https://www.youtube.com/watch?v=eLl6_k_fZn4
Сейчас пробую разные области. Пока только вижу перспективу в работе с ОС, linux kernel, c programming и т.д.
Как обстоят дела в ФП, в частности с clojure? Если после пхп перекатываться в него, и пилить бэкэнд? Такое же формошлепство, только в ФП?
Я не очень хорошо представляю области применения clojure, например.
>пилить бэкэнд
>формошлепство
Гхм...
>области применения clojure
Обычно это бэкенд-сервисы, которые перемалывают данные и отдают их на фронтенд-сервер или в SPA\мобильное приложение. Если речь о clojurescript, то обычно это толстые SPA или react native приложения (http://cljsrn.org/).
Неплохой список типовых зависимостей для веб-проектов: https://dev.to/elarouss/a-beginners-journey-inside-the-clojureclojurescript-web-dev-ecosystem-1-2nm0
LambdaWerk и CircleCI (оче известные в опенсорсном кложекомьюнити конторы) хайрят:
https://functionaljobs.com/jobs/9086-software-developer-flowerpilot-m-f-at-lambdawerk-gmbh
https://functionaljobs.com/jobs/9085-senior-full-stack-software-engineer-at-circleci
Эйчар здорового человека (презенташка про то, как захантить себе уберкоманду): https://clojuresync.com/rebecca-kinsella/
Может есть какие маны или гайды?
мимо переболевший ООП
бочку
1. Используй spec.
2. Разделяй приложение на микросервисы.
3. Прекращай быть фанбоем и решай реальные задачи вместо дрочева на типы\объекты\макросы\теорию категорий\<вставить модную фичанейм здесь>.
Почитай:
https://github.com/stuartsierra/component
https://github.com/weavejester/integrant
Файлы и тесты - в стандартном lein-темплейте же все уже разложено по полочкам. Подробнее смотри, например, здесь (создавать отдельные clj\cljs\cljc каталоги необязательно, особенно если у тебя код и так естественно делится на неймспейсы в зависимости от платформы, типа app.server, app.client, app.common):
http://www.luminusweb.net/docs#anatomy_of_a_luminus_application
Если есть конкретные вопросы - задавай, подумаем.
> решай реальные задачи
В следствии решения реальных задач я и понимаю что языкам нужна типизация, особенно функциональным. Типы входных и выходных данных обычно предопределены и ограничены, потому мне и хочется писать на чем-то типизированном
>языкам нужна типизация
Не нужна.
>Типы входных и выходных данных обычно предопределены и ограничены
Для этого есть spec.
>мне и хочется писать на чем-то типизированном
Для этого есть ocaml, например.
> Не нужна
Не мог бы ты пояснить? Я в серьёз не понимаю чего-то очевидного, видимо.
Есть у нас функция по сложению двух чисел, принимать она всегда, очевидно, будет два числа, возвращать тоже число. В чем смысл делать язык не типизированным, или хотя бы не делать какое-нибудь ебанутый ран тайм аннотейшн чек, раз уж тип данных обычно всегда предопределен?
>ран тайм аннотейшн чек
Я что-то не припомню сходу высокоуровневых языков, в которых функция сложения двух чисел не делает никаких чеков и молча портит память при передаче каких-то странных аргументов.
Если по теме - я же говорю, для этого есть spec. Ты можешь задавать спеки любой сложности, можешь делать на них статический анализ в компайл-тайме (https://github.com/arohner/spectrum), можешь экспортировать спеки в сваггер или жсон схемы, можешь генерировать из спеков юнит-тесты или мок-данные, можешь даже автоматически выводить спеки из кода вместо того, чтобы писать их руками.
Типы - это хорошо и замечательно, и о них нужно думать, когда пишешь код, но на сегодня механизмы статической проверки типов находятся в зачаточном состоянии с точки зрения экспрессивности (если что, я говорю об ML и компании - джава\си-стайл говно вообще системами типов язык назвать не поворачивается). Кроме того, за пределами твоей программы никаких типов нет, так что это вообще что-то вроде экономии на спичках. Действительно важны интерфейсы на границах компонентов, а что внутри этих компонентов - это становится совершенно не важно, стоит хоть чуть-чуть оторвать нос от кода и подняться на уровень выше.
tl;dr: запилите в мейнстрим робастный gradual typing с завтипами, эффектами, поддержкой метапрограммирования, подключаемыми верификаторами и полной рефлексией с возможностью экспорта информации о типах в plain data - тогда и приходите.
Спасибо, анон
Всерьез не понимаю типодрочеров. Ты сам говоришь, что типы входных и выходных данных предопределены. То есть не генерируются, а известны заранее. К чему тогда эти идиотские ограничители? Если так случается что ты не знаешь тип чего-то, спокойной проверяешь типы в репле, это же clojure.
Если у тебя стопроцентное покрытие тестами, то и без типов норм (не так удобно как с типами, но норм). Реальность же, зачастую, намного хуже.
Реальный пример: писал недавно расширение для Хрома. Понадобился parent-selector. Его в css спеке нет. Накостылил. Теперь вместо строки-селектора передается объект {selector: String, parent: Integer}. Вроде поменял везде и задеплоил (читай в продакшен). Через два дня оказалось что не везде. Был бы тогда тест - такого бы не случилось. Использовал бы typescript|flow (читай типизацию) - тоже избежал бы проблем. И это одна маленькая функция в проекте из 3-х файлов на 1к строк в сумме.
Так в том то и дело, что тесты то писать нужно. И все те преимущества, которые дает типизация решается парочкой дополнительных тестов. А забирает она намного больше.
Может я и криворукая собака, но мне намного проще и приятнее писать на кложе, чем на java.util.stream, с тремя дженериками на один метод запаянными в 2 экстендс и 4 супер. Хотя я полностью понимаю PECS принцип. Извините за джава-офтоп
Наличие типов никак не отменяет необходимости писать тесты. Более того, оно никак не сокращает количество тестов, которое нужно написать для хорошего coverage. Тесты с типами вообще никак не связаны, блядь, это совершенно ортогональные понятия. Серьезно, уже порядком подзаебала эта идиотская мантра, извините.
>Вроде поменял везде и задеплоил
Ну вообще, для такого существует https://github.com/clojure-emacs/clj-refactor.el - или на худой конец тупой греп по проекту. Изменять сигнатуру функции и потом руками искать все ее call site'ы - это просто плохая инженерная практика и твой фейл как разработчика (отсутствие тестов - туда же). Да, в этом случае статически типизированный язык стукнул бы тебя по рукам, но в виду вышеозначенных причин это не является хорошим аргументом в сраче статика-динамика (который, кстати, вообще не про отлов тривиальных фейлов, а про логические ограничения и диапазон доступных для написания программ в первую очередь).
>>203667
В то же время, твой пост тоже не является хорошим аргументов против статики, так как система типов в джаве - это несмешная пародия, а не система типов.
А вообще, срачи статика vs динамика, как известно, очень редко бывают содержательными, так что не хотелось бы скатывать в это тред.
Я где-то написал что с типами не нужны тесты? Когда выдумываешь тезисы за собеседника, а потом их оспариваешь - это уже проблемы с головой, братиш.
Clojure, emacs. Я тебе про js пишу.
>не является хорошим аргументом
Ты сказал? Типизация бы проблему решила? Решила. Ты с этим согласен. Делают вывод что типизация полезна.
>Я где-то написал что с типами не нужны тесты?
>Если у тебя стопроцентное покрытие тестами, то и без типов норм
> => а если покрытие тестами не стопроцентное, то без типов не норм
> => покрытие тестами связано с тем, есть типы или нет
Я ровно этот поинт и прокомментировал. Читай внимательнее. "Перед тем, как заходить в этот тред, надо включать мозг. Те, кто этого не делают, будут посланы нахуй быстрее, чем они успеют сказать "не понял"
>Clojure, emacs. Я тебе про js пишу.
А что, в жс рефакторинг как-то по-другому работает? Грепать (на худой конец) по жс-исходникам Аллах запрещает? Алсо, ты в кложетреде это пишешь, поэтому я и привел пример того, какие инструменты в сабже для этого есть. Умерь свой пыл.
>Ты сказал?
Прочитай абзац целиком, я же внятно изложил факты и выразил свою позицию.
>Делают вывод что типизация полезна.
А что, кто-то с этим спорит? Когда выдумываешь тезисы за собеседника... - и далее по тексту. Формальное доказательство корректности, например, тоже полезно, но - увы! - непрактично.
=> а если покрытие тестами не стопроцентное, то типы помогает не совершить некоторые ошибки и повышают надежность кода. Сечешь? Не всегда есть возможность написать автоматический тест.
>Грепать
Ты не понял до конца проблемы. Я когда что-то меняю в коде, я не хочу запускать ручками какие-то инструменты для того чтобы найти все те места, где это может отразиться. Типизация позволяет мне быть уверенным что я ничего не забыл, если программа скомпилировалась. Я то понимаю, что ты у нас никога ничего не забываешь, и вообще у мамы молодец и сверхчеловек, но я тебе уже привел реальный пример, где это помогает простым жалким людишкам как я.
>Формальное доказательство корректности, например, тоже полезно, но - увы! - непрактично.
К чему здесь это? Типизация практична или нет?
>то типы помогает не совершить некоторые ошибки
...как и использование устоявшихся практик разработки, но ты это почему-то игнорируешь.
>Не всегда есть возможность написать автоматический тест.
Если код можно запустить, то его можно и протестировать. И тебе это придется делать в любом случае, независимо от характеристик языка, на котором ты пишешь.
>Я когда что-то меняю в коде, я не хочу запускать ручками какие-то инструменты
Как будто тайпчекер ts не является инструментом и его не нужно запускать. Это пустая демагогия.
>Типизация позволяет мне быть уверенным что я ничего не забыл, если программа скомпилировалась.
Не позволяет. Твой измененный код по-прежнему может скрашиться в рантайме из-за измененного поведения отредактированных функций. Ты путаешь детонационную семантику с операционной.
>где это помогает простым жалким людишкам
Не нужно быть умным, чтобы следовать устоявшимся инженерным практикам. Вообще, организация процессов - это как раз про то, как перестать зависеть от личных качеств отдельных исполнителей.
>Типизация практична или нет?
Нет какой-то одной "типизации". Системы типов а-ля Си откровенно вредны; а-ля Джава - непрактичны в большем\значительном числе случаев. Вообще, следует выбирать тот инструмент, который позволит решить данной команде поставленную перед ней задачу максимально эффективно, а не следовать всяческим религиозным догмам. Алсо, на этот вопрос я уже ответил несколькими постами выше: >>203036
>как и
Я вижу что ты согласен с тем что типизация полезна.
>Если код можно запустить, то его можно и протестировать.
Если очень захотеть можно в космос полететь. Вопрос: какой ценой? Пример всё с тем же расширением: тестирую через puppeteer. У меня расширение добавляет пункт в контекстное меню браузера. У puppeteer, как и у многих прочих инструментов, доступа к этому меню нет. Вообще. Т.е. я просто не могу протестировать эту функциональность. Ручками могу. Но мы же про автотесты.
>Как будто тайпчекер ts не является инструментом и его не нужно запускать.
Ключевое слово было ручками. Запускается тайпчекер автоматически. Не разводи демагогию.
>Ты путаешь детонационную семантику с операционной.
Я не путаю. Это ты отказываешься понимать проблему. С тайпчеком мне будет известно, что в других местах поломалось. Без него - нет. Не во всех случаях. Это же не серебряная пуля. А в конкретном моём примере.
Если о чем-то можно забыть - об этом забудут. Тайпчек помогает мне не забыть и это прекрасно.
>Системы типов а-ля Си откровенно вредны; а-ля Джава - непрактичны в большем\значительном числе случаев.
Но это использование устоявшихся практик разработки, но ты это почему-то игнорируешь.
>Т.е. я просто не могу протестировать эту функциональность.
Замокать не?
> Запускается тайпчекер автоматически.
Братюнь, у меня git hook с pytest прописан, который мне автоматически при коммите тесты прогоняет. По-моему, демагог тут ты.
мимо_питоняша
>Я не путаю. Это ты отказываешься понимать проблему. С тайпчеком мне будет известно, что в других местах поломалось. Без него - нет. Не во всех случаях. Это же не серебряная пуля. А в конкретном моём примере.
>
>Если о чем-то можно забыть - об этом забудут. Тайпчек помогает мне не забыть и это прекрасно.
Забавно, что, в динамических Яп, в том же лиспе, типизация так же проверяется, только во время работы программы.
Что не иллюзорно влияет на производительность.
Профиты в итоге слабо понятны.
Мы отказались от статической проверки типов чтобы делать ее в рунтайме замедляя все в 3 раза.
Ради чего? Лаконичности кода?
Так себе в целом профит. Особенно в свете того, что большую часть типов можно выводить.
А код нужно обмазывать тоннами СПЕЦИФИКАЦИЙ и КОНТРАКТОВ.
Но, должен сказать, в лиспе есть своя магия.
Программы в большинстве случаев работают сразу.
Что странно.
>Я вижу что ты согласен с тем что типизация полезна.
Ну молодец, я об этом еще полтреда назад сказал. Пожалуйста, читай посты, на которые отвечаешь.
>Пример всё с тем же расширением: тестирую через puppeteer.
>тестирую
Ну значит цена вполне приемлема, раз тестируешь. Опять же, я не вижу смысла разводить здесь демагогию на эту тему.
>Запускается тайпчекер автоматически.
А тесты у тебя что, не автоматически запускаются, лол? А компилятор ты силой мысли запускаешь, или все-таки ручками? Бред какой-то, настрой себе билд пайплайн.
>С тайпчеком мне будет известно, что в других местах поломалось.
Я тебе только что объяснил, почему это в общем случае неверно. Завязывай уже.
>Но это использование устоявшихся практик разработки, но ты это почему-то игнорируешь.
Что "это"? Что я игнорирую? Я утверждаю, что слабая типизация - говно; это очевидно любому, кто хоть немного шарит в системах типов, нет? Кроме того, я утверждаю, что checked exceptions - это фейл (что тоже common knowledge), что система типов джавы - unsound, в чем тоже нетрудно убедиться самому. Сдается мне, что ты сам плохо разбираешься в системах типов, отсюда и идут все религиозные стереотипы. Ты писал что-нибудь (пусть уровня петпроджектов) на расте, х-ле, окамле или любом другом языке с нормальной системой типов?
Впрочем, можешь не отвечать, поскольку - повторюсь еще раз - срачи статика vs динамика очень редко бывают содержательными и каждый раз повторяются буквально слово в слово. На >>203036-пост ты ничего не ответил, во всем остальном мы идем на третий круг обсуждения, да к тому же эта дискуссия итт вообще оффтоп, так что предлагаю прекратить.
https://youtu.be/B5H6AdKUthg?t=1m55s
Common Lisp по производительности находится на уровне С++ (sbcl в некоторых синтетических тестах даже обгоняет си). Тот же js, внезапно, тоже бегает примерно на уровне нативного кода. Джава работает может работать быстро отнюдь не благодаря своей кривой системе типов. А статически типизированный х-ль зачастую всасывает по производительности питону. Иными словами - это опять какие-то религиозные стереотипы, имеющие мало общего с реальностью. Статическое указание типов позволяет проводить некоторые оптимизации, которые в противном случае невозможны; из этого никак не следует, что "динамические языки медленные" или "статические языки быстрые".
Я уж молчу про то, что оптимизация - это всего лишь оптимизация (в той же кложе можно статически указывать типы), а информация о типах в рантайме нужна для рефлексии и интерактивной разработки.
Наконец,
>А код нужно обмазывать тоннами СПЕЦИФИКАЦИЙ и КОНТРАКТОВ.
Наличие спецификаций и контрактов совершенно ортогонально вопросу статической\динамической типизации.
>Ну значит цена вполне приемлема
Ты о чём вообще? Братан, завязывай с тем что употребляешь. Я не смог протестировать часть приложения. Не смог. Я тебе привел пример где тестирование невозможно за приемлемую для меня цену.
>А тесты у тебя что, не автоматически запускаются, лол? А компилятор ты силой мысли запускаешь, или все-таки ручками? Бред какой-то, настрой себе билд пайплайн.
Компилятор запускает IDE после каждого изменения. Тесты запускаются для билда или ручками, конечно. Ты их запускаешь после каждого изменения в редакторе что ли?
>в общем случае неверно
Я тебе про конкретный случай уже 3 поста. Специально обозначил, что для всех случаев не сработает, а ты мне это пишешь. Братиш, это ты завязывай с веществами.
>религиозные стереотипы
Какие? Система типов в любом ЯП помогает миллионам программистов. С тем, что типизация полезна, ты согласился. Я отвечал изначально на >>203629 и, получается, ответил.
Няша-питоняша, тайпчекер запускается при каждом изменении в исходниках. Почувствуйте разницу.
>Я не смог протестировать
>тестирую через puppeteer
>я просто не могу
>Ручками могу
Определись уже.
>Ты их запускаешь после каждого изменения в редакторе что ли?
Эм? Юнит-тесты у всех прогоняются после изменения файла на диске, с разморозкой.
>Я тебе про конкретный случай уже 3 поста.
Твою ошибку в том конкретном случае как раз 3 поста назад и разобрали, что тут еще обсуждать?
>Какие?
Гхм, см. >>204008
>Система типов в любом ЯП помогает миллионам
Нет, в прошлом посте подробно изложил этот момент. Лол, тебе бы пропагандоном работать, с такими-то речевыми оборотами.
Вопрос про твой личный опыт ты проигнорировал, >>203036-пост ты проигнорировал; из этого я делаю вывод, что кое-кому не мешало бы подучить матчасть, прежде чем ввязываться в такие дискуссии. Можешь читнуть митовскую "Types and Programming Languages", например.
я анон с этого вопроса, до сейчас был рид онли.
Так в итоге мы пришли к тому что рантайп чек типов нормальная тема, но нет нормальной реализации?
Ну ещё что есть куча других практик добавляющие уверенности что код работает как надо, но сейчас не об этом
>Common Lisp по производительности находится на уровне С++ (sbcl в некоторых синтетических тестах даже обгоняет си). Тот же js, внезапно, тоже бегает примерно на уровне нативного кода.
Это такой троллинг?
Это даже не смешно.
Неужели gzip реализованный на js будет на уровне сишнго эталона?
>Наличие спецификаций и контрактов совершенно ортогонально вопросу статической\динамической типизации.
Ну это вообще пушка.
Развитая система типов == спецификация+контракты.
>Определись уже.
Ты тупой? Извини за оскорбление, но я не понимаю что с тобой. Я не могу всё протестировать. Часть функционала осталась не протестирована. Об этом я и написал.
>Юнит-тесты
Хуйня без задач в большинстве случаев, если ты конечно не библиотечку пишешь. Интеграционные и функциональные тесты я так не буду запускать.
>что тут еще обсуждать?
Твою тупизну? Серьезно. Я тебе сказал конкретный случай, а ты мне про "ну в общем там...". А там не в общем. Там тайпчек помог бы.
К чему ты приплетаешь своё оценочное мнение о различиях в системах типов к вопросу о полезности системы типов (любой). Про типы не типы можешь не писать - мне всё равно что тебе там нравится или нет. Не уводи дискуссию в сторону.
>Особенно в свете того, что большую часть типов можно выводить.
С чем, кстати, sbcl неплохо справляется.
мимо-пробегал
ну чо ты а, скриншотик сделал, забыл, потом вспомнил вкинул
https://github.com/clojure/core.typed/wiki
тем более на скриншотике есть ссылочка, можешь и сам ручками напечатать ох вейт, мы же не в го треде
>Это такой троллинг?
Лол, ну разве что самую малость. Смотри, например: www.iaeng.org/IJCS/issues_v32/issue_4/IJCS_32_4_19.pdf
>Неужели gzip реализованный на js будет на уровне сишнго эталона?
js - это garbage-collected язык с ограниченными возможностями по байтоебству, так что вопрос мне видится несколько наивным.
>Развитая система типов == спецификация+контракты.
Контракты - это, грубо говоря, особая форма ассертов. Они проверяются в рантайме. Погугли. Спецификация - это вообще широкий термин, но обычно под этим подразумевается описание поведения программы на каком-то внешнем языке по отношению к тому, на котором она реализована.
>>204347
Продемонстрировав незнание матчасти, пациент перешел к оскорблениям. Ожидаемо, но тут тебе не /b; разговор окончен.
Как эксперимент и как личный проект ее авторов - успешная штука. Как воспомогательный инструмент - имеет ограниченное применение. Как дефолтный способ писать код - имхо, непрактично.
>js - это garbage-collected язык с ограниченными возможностями по байтоебству, так что вопрос мне видится несколько наивным.
Товарищ Фабрис Беллард с тобой не согласится.
>Я что-то не припомню сходу высокоуровневых языков, в которых функция сложения двух чисел не делает никаких чеков и молча портит память при передаче каких-то странных аргументов.
пардон за оффтоп, но есть такой ;)
https://www.programmingsimplified.com/c-program-add-two-numbers-using-pointers
ввел буквы - молча получил хуевое число
>джава\си-стайл говно вообще системами типов язык назвать не поворачивается
чувак, я на твоей стороне, за динамику, из статики только боролся с scalac, разверни мысль для аргументации в спорах
>потом руками искать все ее call site'ы - это просто плохая инженерная практика и твой фейл как разработчика
кстати наболело, да.
1) grep/ack/ag считается руками?
2) поделись опытом, может какие магии (кроме тестов ессно) найдут случаи когда fn передана параметром/из нее сделан partial/используется внутри lazy-seq?
Лол, touché. Впрочем, как известно и из буханки можно сделать троллейбус - вот только зачем?
>js - это garbage-collected язык с ограниченными возможностями по байтоебству, так что вопрос мне видится несколько наивным.
C# это то-же ГАРАЖ КОЛЛЕКТЕД с ОГРАНИЧЕНИЯМИ, но на нем гзип будет по скорость почти равен сишной версии.
>Продемонстрировав незнание матчасти
У тебя самого познания фрагментированные и весьма теоретического плана.
А тот анон вроде как побольше шарит.
Кто-нибудь пробовал реагент? Насколько он живой и поддерживаемый? А так же во что можно упереться пользуясь им.
Хочу попрактиковаться в разработке простеньких рест приложений с самостоятельным беком, фронтом, с контейнерами.
Бля, ну все, интерпрайс и сюда добрался, куда теперь-то перекатываться?
А если серьезно, интересная вакансия. Опыт разработки от года, то есть фактически джунов считай берут.
Алсо,
>Front-end – Clojurescript, Rum
Уж не Tonsky ли в сбере вротенд тимлидит?
Алсо,
>RDF/EAVT моделирование данных
Они походу datomic используют? Прикольно.
Сообразительный?
>portable assembler
>высокоуровневый
Ага.
>>205034
А что разворачивать-то? Си - слаботипизированный; джава - unsound, без вывода типов, не может в expression problem и просто неудобная; в го параметрического полиморфизма нет, и так далее. Я не знаю, если человек живет в танке, ты хуй ему что объяснишь, а если нет - так он и сам в курсе, как мне кажется.
>>205043
1) Ну, я склоняюсь к тому, что нет, не считается. Юникс-тулзы - это просто, дубово и всегда работает. Но тут мне вполне могут возразить. Вот например, если у тебя в файле есть namespaced ::keywords, и ты его разбиваешь на несколько неймспейсов, то ::keywords, очевидно, теперь будут указывать на разные неймспейсы - это может быть то, что тебе надо, а может и не быть. Не, греп в этом случае конечно тоже поможет, но только если ты не забудешь прогрепать новосозданные неймспейсы по "::". Когнитекты, кстати, вроде вообще не используют :: и всегда пишут полные неймспейсы в спеках. Алсо, имхо довольно разумным будет держать иерархию бизнес-сущностей со спеками в собственной ветви, отдельно от обрабатывающего ее кода. То есть app.data.user, например, для спеков user; затем в условном app.controller.user делаешь require [app.data.user :as user] и пишешь ::user/name для всех аттрибутов юзера. Так можно будет рефакторить app.controller.user как душа пожелает не затрагивая иерархию бизнес сущностей и не ломая интерфейс (контракты данных - это интерфейс). Алсо, прежде чем ооп-петухи начнут орать "МОДЕЛИ ПЕРЕИЗОБРЕЛИ АХАХА" - нет, это не модели, это декларация данных. Модели - толстые, декларации - пустые, в них нет логики вообще.
>>205043
2) Ну тебе по сути нужно искать все call site'ы и фильтровать их в зависимости от лексического контекста, так ведь? В clj-refactor только обычный поиск всех вызовов есть, но можно попробовать приспособить для этой цели https://github.com/jonase/kibit - он как раз ищет паттерны в коде через core.logic. Или ты что-то другое имел в виду?
>>205047
>денотационную же?
Да, конечно. Извиняюсь за опечатку. Детонационная, лол. Какую-нибудь шутку про НЕБОМБИТ добавить по вкусу.
>portable assembler
>высокоуровневый
Ага.
>>205034
А что разворачивать-то? Си - слаботипизированный; джава - unsound, без вывода типов, не может в expression problem и просто неудобная; в го параметрического полиморфизма нет, и так далее. Я не знаю, если человек живет в танке, ты хуй ему что объяснишь, а если нет - так он и сам в курсе, как мне кажется.
>>205043
1) Ну, я склоняюсь к тому, что нет, не считается. Юникс-тулзы - это просто, дубово и всегда работает. Но тут мне вполне могут возразить. Вот например, если у тебя в файле есть namespaced ::keywords, и ты его разбиваешь на несколько неймспейсов, то ::keywords, очевидно, теперь будут указывать на разные неймспейсы - это может быть то, что тебе надо, а может и не быть. Не, греп в этом случае конечно тоже поможет, но только если ты не забудешь прогрепать новосозданные неймспейсы по "::". Когнитекты, кстати, вроде вообще не используют :: и всегда пишут полные неймспейсы в спеках. Алсо, имхо довольно разумным будет держать иерархию бизнес-сущностей со спеками в собственной ветви, отдельно от обрабатывающего ее кода. То есть app.data.user, например, для спеков user; затем в условном app.controller.user делаешь require [app.data.user :as user] и пишешь ::user/name для всех аттрибутов юзера. Так можно будет рефакторить app.controller.user как душа пожелает не затрагивая иерархию бизнес сущностей и не ломая интерфейс (контракты данных - это интерфейс). Алсо, прежде чем ооп-петухи начнут орать "МОДЕЛИ ПЕРЕИЗОБРЕЛИ АХАХА" - нет, это не модели, это декларация данных. Модели - толстые, декларации - пустые, в них нет логики вообще.
>>205043
2) Ну тебе по сути нужно искать все call site'ы и фильтровать их в зависимости от лексического контекста, так ведь? В clj-refactor только обычный поиск всех вызовов есть, но можно попробовать приспособить для этой цели https://github.com/jonase/kibit - он как раз ищет паттерны в коде через core.logic. Или ты что-то другое имел в виду?
>>205047
>денотационную же?
Да, конечно. Извиняюсь за опечатку. Детонационная, лол. Какую-нибудь шутку про НЕБОМБИТ добавить по вкусу.
Используй сразу re-frame - это более полный фреймворк поверх реагента. Очень живой, очень поддерживаемый.
>без вывода типов
Java 10
>не может в expression problem
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5676&rep=rep1&type=pdf
>Java 10
Под "выводом типов" понимают decidability системы типов, а не синтаксические хаки, от которых никому ни тепло, ни холодно.
>>206401
>http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5676&rep=rep1&type=pdf
На всякий случай напомню, что сегодня под expression problem понимается возможность расширения чужих классов на новый интерфейс. В джаве нет аналога тайпклассов, поэтому она не может в expression problem. По ссылке показаны несколько хаков, через которые можно эмулировать нужную функциональность для своих классов. Без лишних пояснений должно быть очевидно, что на отсутствие в языке аналога тайпклассов эти хаки никак не влияют.
>кложурист уличает жабу в отсутствии тайпклассов
Мультиметодам уже завезли диспатч по типу возвращаемого значения?
Вот здесь есть объяснения как раз с твоим примером:
https://stackoverflow.com/q/6948166
https://stackoverflow.com/a/8123973
>>206602
А еще 2+2=4. Достаточно сорвал или продолжать?
>>206608
Во-первых, я никого ни в чем не уличаю, а озвучиваю довольно очевидные, как мне казалось, вещи. Во-вторых, я не вижу, как отсутствие тайпклассов в джаве связано с кложей.
Диспатч мультиметодов основан на произвольном предикате от аргументов, так что да, гипотетически им завезли диспатч по типу возвращаемого значения с момента их появления. Ты, наверное, хотел спросить то же про протоколы - тогда бы твой сарказм был более удачен. Впрочем, всерьез говорить о "диспатче по типу" в динамически типизированном языке мне в любом случае кажется немного глупым. Сохранил пик, лей еще.
Ну естественно, можно взять формулировку Вадлера и смело заявлять, что решения нет ни у кого кроме полутора инвалидов
Ты из какой слоновой башни такой? Людям нужны работающие инструменты, удобные и решающие проблему здесь и сейчас.
> Без лишних пояснений должно быть очевидно, что на отсутствие в языке аналога тайпклассов эти хаки никак не влияют.
Тавтология какая-то.
>что решения нет ни у кого
Кложа, х-ль, раст, свифт, скала (с оговорками)... продолжать?
>Людям нужны работающие инструменты, удобные и решающие проблему здесь и сейчас.
Согласен. В предыдущем параграфе я некоторые из них перечислил.
>Тавтология какая-то.
Ну я же написал, что это "должно быть очевидно". Раз ты со мной согласен, то предлагаю эту тему закрыть.
И тут ты демонстрируешь решение extension problem в твоей формулировке (ссылки достаточно) на раст/свифте по выбору.
До тех пор считаем тебя демагогом.
На всякий случай напомню, что сегодня под expression problem понимается возможность расширения чужих классов на новый интерфейс.
Анон, если ты не умеешь читать документацию, то тебе нечего делать в этом треде. Переводить и разжевывать мануалы тут тебе никто не будет если только это не мануалы по сабжу, так что еще раз предлагаю закончить этот разговор.
Даже при внимательнейшем треде он не сможет найти в ржавой документации примера создания orphan instance. А значит,
>возможность расширения чужих классов на новый интерфейс
для него останется недоступной.
И нет, newtype и аналоги — не то, что он хочет.
А ты точно не семен? Расширение чужих классов на новый интерфейс не предполагает создание orphan instance, Капитан Очевидность на связи.
Более того, в свифте и такой трюк, если я не ошибаюсь, прокатит, так что строго говоря твое замечание в любом случае невалидно.
>Кажется, настало время перейти от слов к реальным цифрам.
Я могу предоставить наивную реализацию на шарпе.
Но сомневаюсь что мой оппонент соизволит повторить ее на JS и той-же кложе.
http://blog.datomic.com/2018/06/datomic-ions.html
https://docs.datomic.com/cloud/ions/ions-tutorial.html
Свежий bidirectional router с прицелом на то, чтобы стать полноценным веб-стаком, от горячих финских ребят:
https://metosin.github.io/reitit/
https://github.com/metosin/reitit
https://github.com/metosin/muuntaja
Описание тут:
https://www.metosin.fi/blog/reitit/
https://www.metosin.fi/blog/reitit-ring/
Follow-up про датомик:
Подкаст Хикки про ions: http://blog.cognitect.com/cognicast/142
Бесплатная опенсорсная реализация части датомика: https://github.com/replikativ/datahike
Плюс несколько сайтов с документацией:
https://cljdoc.xyz/ -- вот этот новый, зацените - годнота
https://www.conj.io/
https://crossclj.info/
Линтер для clojure (jvm): https://github.com/jonase/eastwood
Статический анализатор чистоты функций: https://github.com/whilo/beichte
Зацепило, если честно. Конечно, мир не делится на черное и белое, но меня почему-то всегда больше тянуло к Clojure и подобным ей языкам, где можно делать "quick, spontaneous changes with little pre-planning".
А ты что думаешь на сей счет, анон?
>type /b personalities
Лол, ну на самом деле кое-какой смысл в этом есть. Кложа действительно отлично подходит для bottom-up и быстрого выката mvp. И многих джавистов, например, кложура привлекает именно тем, что основная ее философия - это делать рабочий, полезный код наиболее простым способом (libraries instead of frameworks и вот это все). Да и среди кложуристов с тоннами звезд на гитхабе много сторонников "хуяк-хуяк и в продакшн" (тот же tonsky приходит на ум) - в том смысле, что они не дрочат на абстрактные фабрики синглтонов и монадные трансформеры, а 1) видят задачу 2) решают задачу наиболее эффективным доступным способом.
С другой стороны, я бы себя отнес скорее к type a, например. Параграф culture shock - жиза. И да, мне тоже бомбит от кодстайла Хикки. Тем не менее, сабж - тащем-то один из моих любимых языков, например.
Короче, все эти "X is for Y" - это всегда овергенерализация, и соотношение исключений к подтверждающим ее примерам - скорее что-то в районе 40\60, чем нихуя\дохуя.
>гитхабе много сторонников "хуяк-хуяк и в продакшн"
Так тот же руби еще больше подходит для хуяк-хуяк и в продакшн
Кто-то сказал "Евангелион"? Потому что я думаю, я слышал, как кто-то сказал "Евангелион".
Кложеская либа для умножения матриц в 40 с чем-то раз быстрее аналогичной джавной:
https://dragan.rocks/articles/18/Neanderthal-vs-ND4J-vol1
https://www.dubs.tech/blog/benchmarking-nd4j-and-neanderthal/ чувак ее пофиксил, теперь она медленнее всего в джва раза
Запилили поддержку webpack в кложескрипт:
https://clojurescript.org/guides/webpack
Алсо, там заебатый гайд для жсников есть:
https://clojurescript.org/guides/faq-js
А еще есть жс в кложурскрипт транслятор, можно тыкать в браузере:
https://roman01la.github.io/javascript-to-clojurescript/
Из странного: декларативный фреймворк для клиент-сайда на основе даталога и логического программирования, 10 йоб из 10:
https://github.com/CoNarrative/precept
Из крутого: скринкасты в плейн-тексте. Просто набираешь код, а оно делает из него псевдо-видяху (которая на самом деле не видяха, а текст):
https://asciinema.org/a/160597
Напоследок: rust for clojurists
https://gist.github.com/oakes/4af1023b6c5162c6f8f0
>>217058
У вас онеме головного мозга, гражданин. Не усугубляйте свое положение.
>Кложеская либа для умножения матриц в 40 с чем-то раз быстрее аналогичной джавной
А для Ъ? Что там? Кложуристы открыли jni?
>чувак ее пофиксил, теперь она медленнее всего в джва раза
Лол
>Neanderthal, a Clojure library backed by custom bindings to MKL, is much faster than pure Java libraries even for rather small matrices.
>Most folks who use DL4J and ND4J take for granted that ND4J is as fast as possible, and I don't blame them, for ND4J is much faster than any previous Java matrix library. Except Neanderthal, of course :)
>Here I am measuring the approaches: given that both libraries use MKL, I assume that the raw computation speed is the same, and ascribe any differences to the overhead that the library uses in keeping data around and calling appropriate operations.
> As expected, Neanderthal is 24 times faster.
> on 1024x1024 matrices, which is already quite large, so the overhead should not be noticeable, Neanderthal is still almost twice as fast as ND4J!
> Cool. But what about huge, not-powers of 2 matrices? There is still more than 15% lead by Neanderthal! This is much better than I expected
Из ответного поста джавного чувака:
>And while the difference even in the first benchmark wasn’t as dramatic once the result array ordering is properly set, it has still shown that Neanderthal indeed has a very low overhead and that to get the full performance out of ND4J you should know what you are doing.
>There are still some points where ND4J could lose some more overhead, and we are investigating them, so I’m looking forward to repeating these benchmarks as soon as we have them figured out as well.
Мирдружбажвачка
https://dragan.rocks/articles/18/Neanderthal-vs-ND4J-vol2
Теперь кложелиба в 1000 раз быстрее джавной на более сложных бенчмарках. На порядок, лол, пиздец просто. И при этом по части синтаксиса она гораздо удобнее и ближе к numpy. Короче, запасаюсь попкорном.
Алсо, у чувака оказывается есть неплохие mini-series по линейной алгебре вообще и по реализации числодробилок в частности:
https://dragan.rocks/articles/17/Clojure-Linear-Algebra-Refresher-Vector-Spaces
https://dragan.rocks/articles/17/Clojure-Numerics-1-Use-Matrices-Efficiently
Добавили бы в шапку блок Никиты Прокопова, м?
Верно, чего это я. Сегодня уже продолжение от nd4j:
https://www.dubs.tech/blog/benchmarking-nd4j-and-neanderthal-2/
- tl;dr: "нормально делай - будет всего в джва раза медленнее, а не в тыщу". Ну то есть основная фишка в том, что неандертал опять же из коробки делает the right thing со всеми оптимизациями, а в нд4ж надо следить за этим ручками.
>>219305
Ну перекат будет - можно добавить. Хотя у него же вроде не про кложу в основном? Кстати, я у него еще где-то видел серию обучающих видосиков про сабж (но смотреть не осилил, там для нубов).
Алсо,
https://grumpy.website/post/0QCVRiSyP
>Nobody wants to look at white text on black background.
ПИЗДЕЦ У МЕНЯ ЗА ТАКОЕ НА РАЙОНЕ УБИВАЮТ НАХУЙ и забавно, что в гноме это давным-давно работает именно так, как он предлагает - кококо макось кококо дизайн кококо юикс
вообще, по грампи надо бы отдельный тред создать с ретранслятором постов, жаль эти пидорасы там (анонимные) комменты не включили, такой-то вентилятор с говном получился бы
Он просто думает, что понимает в дизайне. На самом деле человек почти всю свою карьеру работал в бодишопах. Если ты понимаешь о чем я.
>Nobody wants to look at white text on black background.
Он же нормальных людей имеет в виду.
Которые понимают, как работает их зрение, и не хотят ослепнуть к 30 годам.
Код на кложуре - нечитаемая мешанина.
Write only language.
Какое там может быть "quick, spontaneous changes with little pre-planning"? Ты о чём вообще?
Да ещё и без статической типизации?
Есть какие-то вменяемые исследования насчет цвета текста и фона, ну и наверное размер шрифта и яркость тоже надо учитывать?
Они были ещё миллион лет назад.
Гугол в помощь.
Кстати, яркость тут на последнем месте среди влияющих факторов. Т.е. яркость просто должна быть нормальной - примерно - уровень листа бумаги, освещённого так, чтобы читать было комфортно. С учётом фонового освещения.
Вся эта пидорская тема с чёрным фоном пошла от старых макбуков, как мне кажется.
Дело в том, что обычный хипстерский 13" макбук (во времена до-ретины) - был пиздецки мыльным говном. Т.е. рендеринг шрифтов так сделан (в отличие от windows, где всё притянуто к пикселям, и текст чёткий). Я, кстати, сейчас с такого макбука пишу, лол.
Так вот, текст мыльный, и если ещё понизить яркость (ночью), то получается вообще пиздос. А на чёрном фоне (с низкой яркостью) - получше немного. Сам я так не делаю (ибо хуйня всё равнр), но сравнивал.
Плюс, вообще дешёвые ноутбуки с говноматрицами чётче показывают текст в режиме белым по чёрному. Как и дешёвые массовые говномониторы.
Плюс вся эта параша с кодингом в виме и прочей консольной хуйне. Плюс - терминал - чёрный фон, мам, смотри, я профи.
Плюс - желание кодить в полной темноте.
Так ни в коем случае нельзя делать - это 100% пиздец глазам.
Что влияет на утомляемость глаза?
Контуры шрифта должны быть чёткими. Иначе глаз безуспешно пытается сфокусироваться, и устаёт. Не должно быть
мерцания. В тёмное время суток должны быть тёплые цвета (ставь Flux или настраивай монитор). Контрастность не должна быть слишком большой. Но и не слишком малой тоже.
И белый фон, конечно. При соответствующем фоновом освещении, обязательно.
Ну он же последние эн лет фронтендером работает, не? Тащем-то широкой публике он более известен как шрифтовик, а не как лишпер.
>>220043
Попробуй потоньше.
>>220089
>Они были ещё миллион лет назад.
>Гугол в помощь.
Слив засчитан.
>тема с чёрным фоном пошла от старых макбуков
Охуенные истории, лол, такой-то манямирок. А тот факт, что людям а) просто вечером неприятно на 15-дюймовую лампочку пялиться б) просто нравятся темные темы в) не хочется отвлекаться на второстепенные виджеты тебе в голову не пришел? Ютуб и гномский просмотрщик фоток наверное темную тему добавили из-за старых макбуков, ага.
>В тёмное время суток должны быть тёплые цвета
К утомляемости глаз и зрению этот факт вообще никакого отношения не имеет. Учи матчасть. Слышал звон - да не знаю где он.
>И белый фон, конечно.
>белый
Кстати, за белый (не светлый, а именно белый) фон вообще хочется убивать.
>Код на <любой-язык-которого-я-не-знаю/> - нечитаемая мешанина.
>Мой код на <языкнейм/> - нечитаемая мешанина.
Починил тебя, братан. Алсо, попробуй потоньше.
Например:
https://ux.stackexchange.com/questions/53264/dark-or-white-color-theme-is-better-for-the-eyes
https://tatham.blog/2008/10/13/why-light-text-on-dark-background-is-a-bad-idea/
> Алсо, попробуй потоньше.
И это говорит человек, пропагандирующий лисп.
Ну так ты сам ссылки-то свои читал? Там написано, что людям с астигматизмом труднее читать светлый текст на темном фоне при условии отсутствия внешнего освещения.
https://ux.stackexchange.com/questions/53264/dark-or-white-color-theme-is-better-for-the-eyes
>Now there seem to be varying factors into contrast and legibility. Room ambient lighting. Brightness of the monitor. Also you can mitigate the straining effects of white (#FFF) on black (#000) by simply lessening the contrast like using a light gray (#EEE, #DDD, #CCC) on a dark background (#111, #222).
https://tatham.blog/2008/10/13/why-light-text-on-dark-background-is-a-bad-idea/
>This post was written in 2008, based on me scrounging together some complementary links at the time. It’s now 2014, and accessibility is a well thought-out problem, which is generally well solved. Use the colour scheme that makes you happy. I use a black background on my Windows Phone, a dark navy in Sublime Text, a mid-grey chrome around my Office documents, and a bright white background through Outlook and my email.
Слышал звон - да не знаю где он.
Во-первых, я ничего не пропагандирую (ты зомбоящика пересмотрел?), а во-вторых - попробуй потоньше.
Ещё 4 треда на дваче. Потом смерть.
https://www.youtube.com/watch?v=Hbexh-Jutvs&list=PLXsXu5srjNlxI7b2smnHxDeMMwR4mVZ2m&index=2
Чувак запилил визуальную новеллу олдскульный квест на сабже, вывалил стим, позитив ревьюс, сакцесс стори, все дела (не слышал раньше про нее):
http://www.tickstales.com/dev-blog/2015/11/16/making-a-tale-tick-the-making-of-ticks-tales-part-1
Еще один чувак пилит квест визуальную новеллу на хайпе про овервотч, тоже на сабже (охуеть вообще, игры на кложе, пиздец!):
https://twitter.com/mysterysal/status/1016102877201387525
gamedev-edition
Кто-нибудь юзает Typed Clojure с реактом?
Как-то гуглил - должно быть возможно, интересно посмотреть на какой-нибудь проект.
Тащем-то никаких препятствий нет, просто берешь и делаешь. Но ни авторы om, ни авторы re-frame не поддерживают core.typed, например - так что тебе самому придется пердолить типы к их апи, если хочешь, чтоб оно чекалось. Если же ты хочешь типы только для своей бизнес-логики - ок, никаких проблем.
Алсо, погляди на https://github.com/arohner/spectrum - я бы на твоем месте лучше спеки писал.
найдешь такой проект - вкинь, тоже посмотрел бы
Слайд, конечно, вызывает вопросы. Был код на говне. Его отрефакторили на другом языке и из этого делают выводы о чем-то. Не надо так.
>After the 2-month long big rewrite, a stable product was live. Pause. Breathe. After 3 days of releasing, no one noticed there was a new codebase/algorithm in place. That’s what success tastes like
Господи, ну что за хипсторы? Хлебом не корми, дай на новый модный язычок переписать.
Толсто, попробуй тоньше.
>одностраничник с пафосными кричалками вместо сайта
>"революционно, новое поколение"
>вебпарашники запилили очередной чатик на кложескрипте
Из-за таких проектов создается впечатление, что кложей кроме фрониедщиков-дизайнеров никто не пользуется.
>одностраничник
Э, у тебя гиперссылки не работают?
>чатик
А, так у тебя просто не очень хорошо с восприятием информации.
>Господи, ну что за хипсторы?
Вроде как самый дорогой ит-стартуп в юговосточной азии: https://en.wikipedia.org/wiki/Go-Jek
>Э, у тебя гиперссылки не работают?
Работают. А какие нужно было нажимать? Фейсбук, твиттер или сразу переходить к изучению исходников на гитхубе?
>А, так у тебя просто не очень хорошо с восприятием информации.
Да вроде не так уж и плохо, с отсечением маркетингового говна справляюсь.
не бросилось в глаза с первого раза
левую часть все ещё можно привести к правой, поменяв сигнатуры функций и вызывая их точно так же
>А какие нужно было нажимать?
Ты реально такой кретин или просто троллишь тупостью?
https://embark.status.im/
https://hardwallet.status.im/
https://openbounty.status.im/
https://status.im/incubate/
https://status.im/projects/
>Да вроде не так уж и плохо
Ага, то-то ты cryptowallet со своей платформой для п2п-приложений не смог от чятика отличить. Ну бывает, чо.
>>229422
Ну вот они и привели, бггг. Если ты знаком с голангом, то знал бы, что там невозможно писать такой датафлоу как на картинке справа.
в смысле нельзя? Достаточно сделать функции полиморфными и вызывать друг за другом. Или в го что-то не так с полиморфизмом?
и я таки пригляделся к коду го - все я правильно изначально говорил, на скрине в гошке один цикл с ифами, каждый из которых - тип фильтрации, которые и должны быть вынесены из цикла в отдельные функции и применяться к текущему состоянию последовательности поочередно, а справа просто четыре полиморфные функции принимающие и возвещающие список - уже приведенные к этому формату. Что тут что там можно написать одинаково нормально, если я не упускаю что в го что-то не так с полиморфизмом
Не понимаю что тебе не ясно, полиморфизм - понятие об одинаковых интерфейсах и взаимозаменяемости, я употребил этот термин чтобы описать, что предполагаю, что справа просто описано пять функций с одинаковыми типами входных и выходных данных, и что я не представляю почему так нельзя сделать в го. На что мне ответили >>229568 что, видимо, все не так просто.
Ну в го в принципе нельзя писать обобщенный код из-за уебищной системы типов (Пайк тупо ниасилил) например, так что там нет практически никакой стандартной библиотеки для работы с коллекциями (ты тупо не напишешь те же map\filter, для каждого типа нужно отдельную версию функции писать), все приходится каждый раз велосипедить заново, так что на том пике как раз типа идиоматичный го код
Ох, как тебя задело-то, будто святое опорочили.
>Ага, то-то ты cryptowallet со своей платформой для п2п-приложений не смог от чятика отличить.
Ты с больной на здоровую не перекладывай, они сами на главной что пишут? Мы вам тут ОС делаем, которая чатик, и еще сможете грошами кидаться.
>со своей платформой для п2п-приложений
Где она у них своя? Там же просто клиент для эфириума, не? Да еще и с чатиком.
Ну или расскажи нормально, что именно они делают.
>With the future of the decentralized Web so wide open, Status Projects was created to evolve the larger decentralized ecosystem. Our initiatives aim to inspire action, support collaboration, and lay the groundwork needed to help drive Web3 forward.
По ссылкам опять какая-то рекламщина. С тем же успехом могли бы просто lorem ipsum'ом заполнить.
>Ох, как тебя задело-то
К троллингу тупостью тут я давно привык, чини детектор.
>ОС делаем, которая чатик
))
>Ну или расскажи нормально, что именно они делают.
Мне делать больше нехуй? Тебе интересно - возьми да прочитай. Ты в английский не можешь, или что?
>>ОС делаем, которая чатик
>))
>Ultimately what we're building is a hybrid browser and messenger, this allows us to have the best chance at casting the widest net which permits us to focus on user acquisition, staying agnostic and as close as possible to the principles that Ethereum embodies.
>Status is more than a messenger. Send payments and smart contracts to friends from within chats, and enjoy encrypted messaging by default, using a peer-to-peer protocol that doesn’t rely on centralized servers.
Им-то поди виднее.
Ладно, признаю, ты меня затроллил, такой отборной хипстоты от вебмакак ещё поискать нужно.
>Тебе интересно - возьми да прочитай.
Не, спасибо, мне хватило. Уже начитался про то, что их чатик НОВОГО ПОКОЛЕНИЯ БЫСТРЕЕ ВЫШЕ СИЛЬНЕЕ БЕЗОПАСНЕЕ ДЕЦЕНТРАЛИЗОВАННЕЕ и вообще ЗА НИМИ БУДУЩЕЕ и ВЕБ3. Теперь еще неделю монитор от смуззи оттирать буду.
>Им-то поди виднее.
Ну? Блин, анон, ты походу реально тупишь, а не траллишь. Вот у тебя мобильный банк в телефоне есть? Вот они делают то же самое, только 1) п2п, без центральной авторити; 2) как открытую платформу, под которую каждый может писать свои приложения. То есть представь, что у тебя в тинькофф-банке есть кнопочка "плагины", ты заходишь туда и выбираешь, например, плагин для покупки домена. Устанавливаешь, прямо в мобильном банке покупаешь домен, и тинькоф берет на себя все риски по поводу того, чтобы все правильно купилось и работало как надо, никаким 3rd-party регистраторам номер карты не нужно палить.
Вот у них то же самое, только опенсорс\п2п\блокчейн. То, что ты называешь "чятиком", лол, - это основное приложение (криптокошелек). В нем ты можешь пересылать платежи и зашифрованные сообщения другим участникам. Плюс у них еще куча других проектов вокруг этого: хардваллет (хардварный кошелек, считай как банковская карта, только п2п), разные биржи и обменники, распределенный аналог openid\dns, п2п-микроблоги (считай как tor+diaspora, только сразу искаропки в одном мобильном приложении), аналог патреона для кодеров (коммитишь код - получаешь биткоины\эфир себе на счет) и так далее, тысячи их (вроде даже игры есть, лол). Поэтому они и называют это "mobile ethereum os" - по сути это платформа\сдк для распределенных приложений.
>Теперь еще неделю монитор от смуззи оттирать буду.
Ну как бы добро пожаловать в 2018. А еще тут ракеты на платформы в океане сажают, прикинь?
http://www.hyperfiddle-consulting.com/
https://github.com/hyperfiddle/hyperfiddle
http://www.hyperfiddle.net/
Пацаны походу генерируют динамические опердени из edn-данных. Программисты окончательно НЕНУЖНЫ, наконец-то он настал!
Нет, просто у них сайт не рассчитан на всяких сноуниггеров из стран третьего мира, которые не в состоянии купить себе нормальный телефон (у тебя же на телефоне, надеюсь, это вылетает?)
Анон, симпатизирую кожуре, но напрягает один момент. На ней практически нет работы (даже в дс) - вакансий единицы и то часть из них это фронтовая параша на cljs (ненавижу фронт, такие дела, сорян, если обидел).
Ощущение, что большинство адептов, угорает по коже для души, а зарабатывает на хлеб другим языком. Так ли это?
И второй вопрос, продавал ли ты на своей работе кложу, как основной язык для нового проекта? Если да, то как (какая аргументация, как принанил других макак к вкатыванию в сабж, итд).
Воу, у нас есть человек, который нашёл работу на кложе! Теперь кложа более востребованный язык, чем idris
Каждую неделю же постятся удаленные вакансии из европки. Мониторь мейлинг лист\слак, алсо https://functionaljobs.com/ - тот же circleci вообще постоянно хайрит.
>>234724
Сперва в Echo, сейчас вроде какой-то адовый бизнес-консалтинг-тырпрайс-генератор-оперденей пендосам пилит. У него на сайте есть кулстори по всему этому, емнип в эхо ему просто дали бабло и сказали "пили", ну пацан сделал - пацан сказал, короче он там и фулстак сеньор-помидор, и тимлид, и пиэм, ну короче и кложурец, и на дуде игрец.
>>234728
Пидораха, плес
Ты шутник или обосрался просто?
Во-первых, фнукшнлжобс - го девелопер, девопс, очень функшнлю зе комментариев.
Во-вторых ты перечисляешь конкретные конторы, что свидельствует о маргинальности языка. У востребованных решений тысячи открытых позиций на всяких хед.хантерах и линкединах. Это выглядит в духе "ну вообще-то у нас есть 2.5 конторы, которые таки рискнули пописать на кложе". Просто признай, что кложа никому не нужна.
Ты сам то вообще кложей зарабатываешь или очередной мамкин лисп-энтузиаст?
Но вот одна беда, этот синтаксис у clojure. И дело не в том, что трудно сломать мозги на новый подход, а в том что, скорее всего, такой синтаксис непригоден к большому проекту (слишком прост для современных программ). Можно спорить часами и проводить пример как большие умы написали где-то что-то и много (и на ассемблере писали большие программы многие энтузиасты), но это совсем не показатель. Синтаксис реально проблемный, неужели не очевидно? Почему нет простого скриптового языка завязанного на мап/лист-программирование? Да, можно сказать, вон жс, пхп, питон, бери и кодь, но проблема в том что там ты так будешь писать один. Люди реально готовы страдать с монструозными ORM даже в скриптовых языках, натягивая очередные данные на "классы", а потом тут же их натягивая на подобие мапы для рендеринга в html/json и при этом думать что это вообще нормально.
Люди, что с вами не так? Почему скриптовые языки упарываются в ООП и прочие радости например в пародию статической типизация, копируя друг у друга бойлерплейт. А другие языки наоборот уходят в другую крайность липспо-подобных языков и аутируют там в другом своем мирке???
>Во-первых, фнукшнлжобс - го девелопер
Ты долбоеб или как? По-твоему НИЗЗЯ АЛЛАХ ЗОПРИТИЛ постить гофер-вакансии на сайте со словом "functional" в названии? Что за аутизм.
>Во-вторых ты перечисляешь конкретные конторы
Ну точно аутист. Анон спросил, в каких конкретных конторах работал один чувак, я ему ответил. Перечитай хоть куда отвечаешь.
>У востребованных решений тысячи открытых позиций на всяких хед.хантерах
))
По такой логике вообще кроме пхп ЖС ЧТМЛ ЦСС больше в мире ничего не существует, а, например, няшная, р, скала, да тот же го, даже 1с - "маргинальные" языки, лол.
Вон только вчера в мейллисте запостили, например:
https://groups.google.com/forum/#!topic/clojure/Vw5Hu7Ioh9o
Вон эти чуваки https://en.wikipedia.org/wiki/Sparrho ищут разраба:
https://groups.google.com/forum/#!topic/clojure/TiJS2A_FPlY
Ну и так далее:
http://clojuredocs.org/jobs
https://jobs.braveclojure.com/
https://functional.works-hub.com/jobs/clojure-developer-london-2aa24
>Ты сам то вообще кложей зарабатываешь
В данный момент уже нет.
Что за говно у тебя на пике? Пиздец. Это твой код? Пиздец, убей себя об стену.
>Но вот одна беда, этот синтаксис у clojure.
Точно такой же как у жс, только примерно в полтора раза меньше скобок и нет обязательных запятых и точек с запятой.
>И дело не в том, что трудно сломать мозги на новый подход
Если ты не даун-аутист, то на привыкание к (f x) вместо f(x) у тебя уйдет примерно 2 вечера.
>синтаксис непригоден к большому проекту (слишком прост для современных программ)
Чего блядь? Еще раз, синтаксис точно такой же, как у жс, только гибче и богаче (есть отдельный литерал для множеств, есть отдельный дататайп кейвордов для уникальных ключей, есть ридер теги для дат и ууид, плюс их можно расширять своими типами; нет точек с запятой). Плюс синтаксис к размеру проекта вообще отношения не имеет, блядь, что за хуйню ты несешь? Пригодность к большому проекту определяют процессы в твоей команде, платформа твоего языка и архитектура твоей системы. Бизнесу (и всему миру) вообще похуй, ставишь ты там точку с запятой в конце строки или не ставишь.
>Синтаксис реально проблемный, неужели не очевидно?
Ну если код на пике твой, то проблемы не в синтаксисе, а в голове кое у кого. Алсо, "неужели не очевидно" - это заебись технический аргумент, ага. Не страдай хуйней, короче.
>Почему нет простого скриптового языка завязанного на мап/лист-программирование?
Есть (clojurescript+lumo). Guile сюда же можно, ну и lua в принципе тоже, хотя в этих двух все печальнее конечно. Блядь, да тот же жс с андерскором.
>там ты так будешь писать один
Пиздишь, дохуя народу колются, страдают, но пишут functional js. По сути весь современный жс с вебпаками и редаксами - это примерно 3/4 того, чем кложурскрипт уже был лет 5 назад. И без жвм, кек.
>и при этом думать что это вообще нормально.
Ну тут ты прав, я тебя полностью поддерживаю. Походу много кому платят за количество строчек кода в проекте, кек.
>аутируют там в другом своем мирке
Это ты аутируешь, нет никакого "другого" мирка. Везде {} - мапы, [] - вектора, вот это все. Писать (f x) или f(x) или f x вообще нет никакой разницы (если ты не даун-аутист), за исключением того, что первое позволяет иметь удобную макро-систему.
Что за говно у тебя на пике? Пиздец. Это твой код? Пиздец, убей себя об стену.
>Но вот одна беда, этот синтаксис у clojure.
Точно такой же как у жс, только примерно в полтора раза меньше скобок и нет обязательных запятых и точек с запятой.
>И дело не в том, что трудно сломать мозги на новый подход
Если ты не даун-аутист, то на привыкание к (f x) вместо f(x) у тебя уйдет примерно 2 вечера.
>синтаксис непригоден к большому проекту (слишком прост для современных программ)
Чего блядь? Еще раз, синтаксис точно такой же, как у жс, только гибче и богаче (есть отдельный литерал для множеств, есть отдельный дататайп кейвордов для уникальных ключей, есть ридер теги для дат и ууид, плюс их можно расширять своими типами; нет точек с запятой). Плюс синтаксис к размеру проекта вообще отношения не имеет, блядь, что за хуйню ты несешь? Пригодность к большому проекту определяют процессы в твоей команде, платформа твоего языка и архитектура твоей системы. Бизнесу (и всему миру) вообще похуй, ставишь ты там точку с запятой в конце строки или не ставишь.
>Синтаксис реально проблемный, неужели не очевидно?
Ну если код на пике твой, то проблемы не в синтаксисе, а в голове кое у кого. Алсо, "неужели не очевидно" - это заебись технический аргумент, ага. Не страдай хуйней, короче.
>Почему нет простого скриптового языка завязанного на мап/лист-программирование?
Есть (clojurescript+lumo). Guile сюда же можно, ну и lua в принципе тоже, хотя в этих двух все печальнее конечно. Блядь, да тот же жс с андерскором.
>там ты так будешь писать один
Пиздишь, дохуя народу колются, страдают, но пишут functional js. По сути весь современный жс с вебпаками и редаксами - это примерно 3/4 того, чем кложурскрипт уже был лет 5 назад. И без жвм, кек.
>и при этом думать что это вообще нормально.
Ну тут ты прав, я тебя полностью поддерживаю. Походу много кому платят за количество строчек кода в проекте, кек.
>аутируют там в другом своем мирке
Это ты аутируешь, нет никакого "другого" мирка. Везде {} - мапы, [] - вектора, вот это все. Писать (f x) или f(x) или f x вообще нет никакой разницы (если ты не даун-аутист), за исключением того, что первое позволяет иметь удобную макро-систему.
>Это твой код?
>Ну если код на пике твой
ватермарк глянь "рука-лицо.жыпег"
>Еще раз, синтаксис точно такой же, как у жс
Тут можно даже сразу прекратить беседу. Хоть и жс тот еще процедурный кал, но ничего общего с простынями clojure там нет. Можно конечно быть способным, чтобы найти что-то общее, но у нас же не специальная олимпиада?!
Самое забавное, если бы кложа была бы клоном js (урезанной по максимум), то код был бы куда читабельнее, просто потому что императивный стиль удобнее сопровождать, чем код написанный ввиде "дерева выражений" или как-это называется, та самая прерогатива компилятора/интерпритатора, а не программиста
>ватермарк глянь
Лол, не обратил внимания. В чем тогда твоя претензия к синтаксису, если ты понимаешь, что на твоем пике мЕмАСиК))0)?
>Хоть и жс тот еще процедурный кал, но ничего общего с простынями clojure там нет.
С какими простынями? Объем кода на клжс по сравнению с жс в среднем будет немного меньше на тех же задачах. Можешь нормально описать, о чем ты говоришь?
>Можно конечно быть способным, чтобы найти что-то общее
Ну жс как бы изначально создавался как лисп для верстальщиков в си-подобном синтаксисе, лол. Но это так, к слову.
>код был бы куда читабельнее, просто потому что императивный стиль удобнее сопровождать, чем код написанный ввиде "дерева выражений"
У тебя какая-то каша в голове. Императивный код в общем случае сложнее сопровождать, потому что там много глобального состояния (глобальное состояние - это плохонько). Императивность\декларативность не имеет вообще никакого отношения к синтаксису и "деревьям выражений", это абсолютно ортогональные вещи. У меня такое чувство, что ты где-то начитался каких-то мЕмАсиКОв))0) или чего-то такого, но сам в теме еще не разбирался, поэтому у тебя все в куче. Давай ты приведешь конкретный пример того, что тебе не нравится, чтобы можно было что-то предметно обсуждать. Я вот не понимаю, чем
obj.foo().bar().frobnicate();
лучше
(-> obj foo bar frobnicate)
- если тебе не платят за количество символов в твоем коде, that is.
>obj.foo().bar().frobnicate();
>лучше
>(-> obj foo bar frobnicate)
Да ну конечно лучше, но коротенькие примеры не делают этот код императивнее, если начинаешь склеивать это в дерево выражений, получается лапша заканчивающаяся улыбками "))))))".
У тебя две проблемы, ты отвечаешь сразу не дочитав весь текст и ты додумываешь про человека какие-то вещи, вместо того чтобы отвечать конкретно на пост.
Основной поинт который я раскрыл в том посте это то, что писать императивно удобнее и читабельнее, чем писать код в виде "дерева выражений" какие еще глобальные состояния, о чем ты??? Можно сделать имутабельно все и императивном программирование
Идея взять мапу и лист и построить вокруг этого язык - не плоха, я всеми руками за, но только в нормальном императивном стиле, а не дереве выражений, чтобы это было популярно только у полтора программиста во всем мире я утрирую, не надо только мне сразу приводит пример численность программистов.
То есть, не надо доказывать что кложа этот тот же жс мол "че ты не видишь чтоли, дурачек совсем?", надо просто признать самому себе, что подход действительно не популярен.
PS В идеале, не вижу проблем даже для одного программиста - взять идеи кложи и склепать какой-нибудь новый "жс" на коленке, на той же jvm/жс машине, но сделать программирование мапами/листами - популярнее для всех, а не натягивать сову на глобус через дерево выражений и доказывать всем что ты прав.
>Основной поинт который я раскрыл в том посте это то, что писать императивно удобнее и читабельнее, чем писать код в виде "дерева выражений"
У тебя в голове полная каша и недостаток знаний. Язык на абсолютно любом языке подвергается парсингу и представляется в виде дерева выражений перед тем, как быть оттранслированным в машкод или байткод ВМ или выполненным интерпретатором; в лиспах просто разница между этим внутренним представлением и текстом программы околонулевая. Почитай dragon book, может, после этого больше не будешь позориться на форумах, пускай даже и анонимных.
>языке подвергается парсингу и представляется в виде дерева
Я разве говорил обратное? Я говорил что это не задача программиста писать в виде дерева-выражений.
Ну не популярное это решение, не нужно даже читать книги с драконами, чтобы это заметить.
Услышь меня - идея то не плохая, реализация говно.
И если эту реализацию человек понимает только после книги с драконами или там с пони, то какой в этом смысл? Где твое критическое мышление?
>У тебя в голове полная каша
>позориться на форумах
Ты же понимаешь что переход на личности, это самый низкий показатель ума в диалоге ну или не способность человека уже вести проигранный диалог.
Зачем тебе это? Мы же не в /b/
>коротенькие примеры не делают этот код императивнее,
Анон, еще раз: ты не понимаешь, что значит слово "императивный". Погугли, пожалуйста.
>если начинаешь склеивать это в дерево выражений, получается лапша
Нет, не получается. Если получается, значит ты делаешь что-то не так (пишешь говнокод, например).
>Основной поинт который я раскрыл в том посте это то, что писать императивно удобнее
Учитывая, что под словом "императивно" ты понимаешь не то, что весь остальной мир, яснее от этого нихуя не становится.
>Можно сделать имутабельно все и императивном программирование
Цитирую википедию: "In computer science, imperative programming is a programming paradigm that uses statements that change a program's state."
>подход действительно не популярен.
Какой подход? У тебя каша в голове.
>не вижу проблем даже для одного программиста - взять идеи кложи и склепать какой-нибудь новый "жс" на коленке
Не видишь ты их оттого, что видимо не занимался разработкой языков. (Я уж молчу про то, что это никому ненужно.)
>не натягивать сову на глобус через дерево выражений и доказывать всем что ты прав
Анон, разберись с терминами и сформулируй свою мысль нормально. Пока я слышу только "f(x) лучше чем (f x)". Я еще в прошлом посте просил тебя привести конкретный пример кода, с которым у тебя проблемы. Прошу еще раз.
>в лиспах просто разница между этим внутренним представлением и текстом программы околонулевая
На самом деле это не так - разница огромная. Можешь посмотреть выхлоп аст здесь, например: https://github.com/clojure/tools.analyzer
Но посыл поста правильный: ты в любом случае строишь дерево выражений. Более того, это дерево в основном отбивается индентацией, так что разница вообще минимальна (разве что sexpr'ы удобнее структурно редактировать и\или автоматически расставлять скобки parinfer'ом на основе индентации).
>>238379
Тебе другой анон отвечал, если что.
>И если эту реализацию человек понимает только после книги с драконами
Какую реализацию? Я уже писал и повторюсь еще раз: любой нормальный инженер, если он не даун-аутист, привыкает к новому синтаксису максимум за 2 вечера. Книги с драконами к этому отношения не имеют - их нужно читать просто чтобы представлять, как работают инструменты, которыми ты пользуешься (ну и чтобы иметь возможность их разумно обсуждать с другими людьми).
>Цитирую википедию
Не надо, я серьезно, не надо такого делать.
Если без простыни текста (крайне упрощено):
Императивный подход - это последовательное исполнение инструкций.
Функциональный подход - это процесс вычисление функций (какого-то их множества).
Естественно императивный подход предполагает последовательность, а значит какое-то состояние передается между последовательностями, но это не определение этой парадигмы, это его побочное свойство (меня часто радует когда в императивных языках стараются победить мутабельность, люди искренне не понимают что это часть их системы).
Читать (не писать) последовательный код - куда удобнее, чем математическое дерево.
Поэтому не нужно демагогию с драконами и пони разводить, пройдемся кратко:
Последовательное императивное исполнение - хорошо.
Чистые функции - хорошо
Иммутабельность - в отдельных случаях, хорошо (просто потому что не панацея)
Писать математическое дерево выражений - не прагматично, именно поэтому все ФП не популярно (а не потому что ты не такой как все, недооцененный гений андеграунда)
PS
Меня больше пугает что ты сравниваешь f(x) и (f x), то есть у тебя в голове вообще нет различия и понимания ФП и ИП подхода, ты вероятно видишь ФП как последовательность и даже не понимаешь почему тебе предлагают танцевать от математического дерева? риторический вопрос
забыл:
программировать от словарей и листов - великолепно (только не плохо было бы ввести какие-то описательные словари, потому что многие привыкли к классам и структурам, так как они изначально где-то прописаны).
Правда я обычно просто клонирую описанную ранее мапу, но это больше костыль.
Мечты
Если мы добавим последовательность в ФП мы, конечно же, получим процедурное программирование. Но что еще интерпретируемым языкам надо?? Пускай в нем есть многие фишки с ФП, иммутабельность, пускай функции это выражения... И если в таком языке можно было бы запретить таскать всякий кал типа классов и прочей ереси - язык бы стал идеальным. Причем так же везде дергались функции (но уже последовательно) и ничем особо не отличалось от той же кложи.
>но это не определение этой парадигмы
Ну вот в википедии - определение. У анона с двача - может и не определение. Но для таких неформальных понятий между определением анона с двачей и определением популярного и читаемого словаря лучше выбирать второе, просто чтобы не было путаницы.
>последовательный код - куда удобнее, чем математическое дерево
Ты путаешь синтаксис, модель выполнения и синхронность\асинхронность. Тебе уже два анона сказали, что у тебя каша в голове.
>Последовательное императивное исполнение
(-> foo bar baz frobnicate). 90% кложекода пишется по такой модели. Последовательное, синхронное исполнение.
>Писать математическое дерево выражений
Я не знаю, что такое "математическое дерево выражений" и при чем тут вообще математика. Тебе арифметика в стиле (+ 1 2 3) не нравится, или что?
>именно поэтому все ФП не популярно
Самый популярный язык на сегодня (жабаскрип) - функциональный как бе. В более узком смысле ФП означает иммутабельность данных по умолчанию. В еще более узком смысле ФП означает иммутабельность и развитую статическую систему типов. Что такое "математическое дерево выражений" и какое отношение лисп-синтаксис имеет к ФП я все еще не знаю.
>почему тебе предлагают танцевать от математического дерева?
Мне никто не предлагает танцевать. Сформулируй уже наконец нормально свою мысль и приведи примеры кода, с которым у тебя проблемы (прошу в третий раз).
>>238503
>ввести какие-то описательные словари, потому что многие привыкли к классам и структурам
В кложе есть 1) records 2) спеки для произвольных словарей (в теории - статически проверяемые), смотри s/keys
>я обычно просто клонирую описанную ранее мапу
Суть в том, что надо плясать не от мапов, а от rows (пар ключ-значение, ну или в общем случае тегированных типов).
В кложе классов нет (они есть в хост-платформе). Кложа - explicitly non-oop язык, это такой opinion у Хикки. Но там есть мультиметоды для ad-hoc полиморфизма, есть протоколы (считай тайпклассы\трейты) для абстракций, есть наследование реализации (реализациями можно как угодно перекидываться) и есть иерархии наследования (это когда у тебя есть некий уникальный идентификатор, например, :zoo.animals/lion, и ты говоришь, что он - потомок :zoo.animals/cat и :africa.fuckups/predator).
Все перечисленные фичи реализованы и работают полностью независимо друг от друга (иерархии никак не связаны с мультиметодами, мультиметоды никак не связаны с протоколами), но при этом play well with each other, разумеется.
Для более традиционного определения ооп (мутабельные инкапсулированные компоненты + DI), смотри:
https://github.com/stuartsierra/component
https://github.com/danielsz/system
или
https://github.com/weavejester/integrant
https://github.com/duct-framework/duct
https://www.reddit.com/r/Clojure/comments/942xxo/distributed_masonry_onyx_platform_acquired_by/
https://www.masteringemacs.org -- у этого дяди качать книжку
http://ergoemacs.org/emacs/emacs.html -- а тут неплохие туториалы по всему, плюс есть кусок про написание собственных пакетов
>После вскода очень неудобно пользоваться.
Нахуя тебе имакс? В вскоде нормальная поддержка кложи. Если хочется чего-то самого лучшего, то ставь идею+курсив.
Имакс - это целая отдельная вещь, к сабжу треда не имеющая особого отношения. Если у тебя есть ОЧЕНЬ много свободного времени, то конечно стоит в него вкатиться (хотя бы потому, что это один из самых успешных и живучих софтваре-проектов в истории человечества), но это отдельное большое приключение.
А так - да, спейсмакс сейчас самый популярный вариант. Накатываешь cider с nrepl'ом и допиливаешь напильником (в допиливании напильником суть(тм) имакса).
Но лучше просто поставь плагин в свой вскод и не еби мозги. Если уж так хочется экзотики, накати лучше light table, заодно можешь попрактиковаться в кложе через написание плагинов.
https://twitter.com/puredanger/status/1028103654241443840
СЛАВА ХИККИ
Очевидный сompojure очевиден. Как разберешься, что к чему, можешь глянуть на luminus (это то же самое, но с батарейками). Ну и типа в целом там по хттп/рест что-нибудь почитай.
Спасибо анончик.
https://dev.clojure.org/jira/browse/CLJS-2831
Так, я так понимаю graal.js это жса на жабе? Только я не могу понять в какой виртуальной машине потом весь этот зоопарк будет бегать, в жсовской?
Не, грааль - это короче хуйня, которая позволяет компилировать байткод jvm в нативный код и исполнять все это с минимальным нативным рантаймом, без жвм. Ну то есть компилируешь в байткод -> компилируешь в нативный код -> подключаешь одну шаред лайбрари, условный glibgraal - и все работает.
Один чувак, например, так компилял простой веб-сервер на compojure. То есть пишешь обычный веб-апп на кложе, компиляешь, получаешь на выходе бинарник на 10 мегабайт без зависимостей и с мгновенным стартом, профит. Можно пилить микросервисы, не имея 64гб рамы для жвм.
Соответственно грааль.жс - это рантайм для жса на основе граальвм. Плюс у них там есть еще фреймворк для реализации языков на основе граальвм, и все реализации на этом фреймворке могут между собой общаться. Ну то есть как жвм, только без жвм. Раньше в жвм был жс-рантайм (rhino например), теперь можно код под него взять и засунуть в грааль.жс, и будет то же самое, только без зависимости от жвм. Плюс они вроде как хотят как-то интегрироваться с нодой, нпм и всем этим прочим.
То есть ты компилишь кложурскрипт в жс, жс исполняется внутри бинарника грааль.жс, все. Судя по гитхабу, это именно отдельная реализация рантайма, точно так же, как и нода - у них там на крестах все - но с использованием общего языкового фреймворка для граальвм (трюфеля)). Так-то было бы прикольно, если бы они просто перекомпилили тот же райно под грааль. Тогда бы получилось, что ты компилишь кложурскрипт в жс, потом жс исполняется в райно, который написан на джаве, которая скомпилена в жвм байткод, который скомпилен в нативный код, лол. А на самом деле там наверное еще не чисто нативный код, а все-таки легковесная вм-рантайм (я не разбирался, как оно внутри устроено, компилит в бинарники - вот и ладушки), короче WE NEED TO GO DEEPER, лол.
Но только сегодня я осознал: единственное, что меня волнует, это рантайм-поведение. Блядь, все так просто. Не нужны никакие завтипы, монады и прочее. Нужна лишь спецификация, проверяющая каким угодно образом это самое поведение. И что же лучше всего подходит в качестве такой спецификации? Мозговыносящие пруфы и леммы? Нет, spec'и и юнит-тесты позволяют описать ту же спецификацию, затрачивая 1% усилий.
Принимайте в секту, джентльмены.
Я просто не понял какой толк гонять кложуржс в граальжс. Если можно было бы гонять кложур в жвм с граалем, разве не быстрей бы было? А трюфл он для них общий же.
Правда, есть один вопрос, слегка смущающий меня в кложе: что будет, если Хикки/Когнитект завтра ВСЁ?
Если Брендан Айк исчезнет, с JS ничего не случится, bus factor давно перевалил за 100к.
Если Гослинг испарится, никуда не денется.
Если Страуструп слетит с катушек, то c++ не станет хуже.
А насколько кложа как язык завязана на своих создателей?
Добро пожаловать, снова :3
Алсо, монады нужны, охуел чо ли.
Алсо, в идеале нужно конечно и то, и то. Но рефлексия first, а потом уже на нее накидывать статику, желательно много разной статики.
>>247338
А что будет с руби, если Матц все? Интересно.
Конкретно Хикка язык вообще никак не поддерживает, на него ничего не завязано. Ну то есть блядь, как бы на него все завязано (он лично должен в качестве финального шага зааппрувить каждый патч, прежде чем его примут в релиз), но по факту он не поддерживает код, он только занимается будущим (дизайном и кодингом новых крутых штук). Поддерживают и разрабатывают язык в основном работники когнитекта, это да, но что значит "все"? Это консалтинг/аутсорс контора, которая продает датомик и динамические опердени, плюс саппорт волмарту, каким-то банкам, circleci итп. Ну то есть чтобы когнитект ВСЕ, нужно, чтобы сперва кложа ВСЕ (причинно-следственную связь в твоем вопросе инвертируем-с), да и даже при этом они могут продолжить клауд джавахуйню всякую продавать.
Плюс это чисто сам язык, а комьюнити проекты поддерживает баблом некоммерческий фонд, в который когнитект донатит какие-то символические 100 баксов или что-то в таком духе. Ну то есть чисто финансово даже если завтра весь когнитект будет abducted by aliens особой трагедии не будет. Плюс они там завязаны на Software Freedom Conservancy, веб-стак immutant разрабатывается редхатом\жбосс, ну короче тырпрайс все дела.
Другое дело, мол если Хикку похитят (((рептилоиды))), будет ли такое же развитие с охуенными идеями каждые полтора года, но это как бы сам понимаешь ко всему относится в этом плане меня больше беспокоят Торвальдс и ко или Столман, например, ну и вообще вопрос философский.
>какой толк гонять кложуржс в граальжс.
Ну это просто еще один рантайм. Можно его встраивать куда-нибудь (в оракл), можно на нем тесты гонять, етк.
>Если можно было бы гонять кложур в жвм с граалем, разве не быстрей бы было?
Так и можно же (и притом без жвм). Насчет медленнее\быстрее - не знаю, наверное быстрее. Но если у тебя УЖЕ ЕСТЬ проект на клжс, и тебе нужно вызвать из него либу на р, например, то теперь ты и это можешь сделать. То есть и клжс, и обычная кложа там поддерживаются.
Плюс еще есть такой момент, что в скомпилированном граалем коде нельзя юзать динамические класслоадеры. То есть - нельзя вызывать eval. Теоретически, в клжс на грааль.жс такого ограничения не будет, потому что гугл портирует свой компайлер с джавы на жс, ну и плюс есть забутстрапленный клжс-ин-клжс... короче, по идее можно будет динамически компилировать и подгружать код на клжс внутри грааль-бинарника.
Хотя может тима грааля быстрее добавит поддержку динамических класслоадеров в джавный грааль, лол.
>Describe a work situation where you had to decide between two equally appealing options. Creative work is about trade-offs. We'd like to learn about how you assessed the options and decided between them.
Сука, блядь, вот ненавижу такие вопросы, что на них отвечать? Все равно ведь и я, и читающий это оба знаем, что это будет какая-то приукрашенная сказочка, блядь, ненавижу эти трик квешчнс. Да и любой каждый день по сотне таких десижнов делает, то есть блядь надо именно привести такой кейс, где блядь ты такой охуенный супермен сделал правильный выбор и потом это вылилось в сэкономленные килобаксы для бизнеса, или какая-то подобная хуйня. Блядь, или это вопрос не на опыт, а на стиль мышления? То есть суть именно в том, как и основываясь на чем ты выбираешь? СУКА, ебаные эйчары и психолухи, ненавижу блядь
инб4: выбирал между тем, чтобы поскроллить двач или съебаться с офиса пораньше, было лень вставать из кресла, поэтому выбрал скроллить двач и залогировать это время в таску, в конце месяца дали повышение за переработку
> выбирал между тем, чтобы поскроллить двач или съебаться с офиса пораньше, было лень вставать из кресла, поэтому выбрал скроллить двач и залогировать это время в таску, в конце месяца дали повышение за переработку
Егор, ето ти?
Неплохой читшит\туториал ребята для воркшопа сделали: https://github.com/friemen/cugb/blob/master/kickstart.md
Только в конце какое-то странное соглашение по именованию атомов, по-моему говно. Рядом с атомами все равно всегда либо функция с ! на конце, так что и так видно, что тут меняется состояние, либо дереференс: @atom - так что опять же видно, что мы из контейнера достаем значение. Нахуй надо еще один ! в имя самого атома добавлять? Хуй их знает.
>>252790
Да, ето так!
Нее, на жабовской. В двух словах это еще один заход на тему соснуть у ноды и V8. Предыдущие два rhino и nashorn были просто порваны по производительности. Имхо граль граль.жс ждёт та же судьба и то же амплуа странного нинужно.
>Нее, на жабовской.
Так вся суть в том, что написано оно на жаве, но с помощью грааля компилится в нативный код. Так что они с одной стороны закрывают райно\нашорн нишу (пускать жс внутри жвм), а с другой делают и стенд-элоун жс-движок, который может в интероп со всеми остальными языками на граале (руби, кложа, r...).
Прикольная игрушка на кложескрипте: https://cdn.rawgit.com/yogthos/graviton/game-jam/release/graviton.html
https://trainline.github.io/optimus/
https://engineering.thetrainline.com/presenting-optimus-an-open-source-data-store-838115d7d98c
>We, at Trainline, are delighted to announce Optimus, an open-source data store which provides transaction isolation semantics and version control mechanism on top of a traditional key-value store. Optimus is designed to be used by Data Scientists to store and retrieve reference data and model co-efficients calculated across millions of keys.Optimus is a key component of our data platform which is designed to enable Data Scientists to build and deploy data products with highly predictive features, driven by data, that save our customers time, hassle and money. Optimus is the data store that powers Trainline features like BusyBot and Price Prediction.
Релейтед: Дэвид Нолен перешел из Когнитекта в какую-то другую продуктовую кложекомпанию:
https://www.suiteness.com/blog/clojurescript-suiteness-welcomes-david-nolen
https://www.youtube.com/channel/UC1lFJanm5Wp6IpNk-2C1Sxw
Ответьте пожалуйста на несколько вопросов.
1. Насколько перспективно это для веб разработки? Для бэкенда? Для фронта?
2. Востребован ли Clojure среди работодателей или как Haskell больше для личного развития?
3. За пределами ДС реально найти галеры где его использует? СРавнивая весь СНГ.
Бля, уже который раз вижу ссылку на этот видос, видимо все-таки придется посмотреть, лол.
>>273997
1. define "перспективно". В плане потенциального роста скилла и зарплаты - да, однозначно перспективно.
2. Держи короче пасту из соседнего треда: https://pastebin.com/raw/TLpP80y9
3. Подписан в твиттере на пару кложуристов из зажопинсков, так что реально, но это все по знакомствам, разумеется.
В проде на работе сокет сервер чудесно пашет, 0 проблемо.
Дома торговый бот на кложке, иммутабельность помогает быстро по потокам каждую секунду раскидать не беспокоясь о сайд-эффектах.
Работа регулярно встречается в профильных темах, и удалёнка и CTO, Англия, Германия, США.
Приятный язык, на фронте всё ж предпочту vue ибо быстрее. А вот ноду на бёк - ну иво нахуй. Однопоточная, хоть и асинхронная - в моём деле не помощник.
нет
В смысле не потому, что нет, а что рассказал уже.
Многопоточность нужна для посекундного обсчёта ситуации.
Подробнее - это уже о финансах, то есть от задачи, а это не очень по теме. По теме - ну, то, что раньше оно было на питоне и не устраивало скоростью обсчёта и вот этим всем гемором с многопоточностью и было медленнее оттого в 15 раз.
А так, раскидал валюты, индикаторы, по тредам, причём очень просто, в (futures обернуть). Мало того, ход выполнения можно наблюдать постоянно делая deref у атомов - этого чудесного средства общения потокобезопасного. И потом собрать всё в кучку через подобие await, я макросы юзаю для такого, в этом случае удобно.
<pre>
(ns tr.lib.futures)
(defmacro futures
[n & exprs]
(vec (for [_ (range n)
expr exprs]
`(future ~expr))))
(defmacro wait-futures
[& args]
`(doseq [f# (futures ~@args)]
@f#))
;; HOWTO USE
;(defn sleeper []
; (Thread/sleep 1000))
;; Threaded code, will run 1 second
;(defn test-futures []
; (wait-futures 1
; (sleeper)
; (sleeper)
; (sleeper)
; (sleeper)))
;(time (test-futures))
;; Original single thread code, 3 seconds
;(defn test-simple []
; (sleeper)
; (sleeper)
; (sleeper))
;
;(time (test-simple))
</pre>
Ещё удобно, конечно, залипания сокета у биржи убирать (ни exceptions, ничего не выкидывается( просто рестартуя части программы через mount из scheduler внутреннего, тоже классно. Живая просто штука)
А так, раскидал валюты, индикаторы, по тредам, причём очень просто, в (futures обернуть). Мало того, ход выполнения можно наблюдать постоянно делая deref у атомов - этого чудесного средства общения потокобезопасного. И потом собрать всё в кучку через подобие await, я макросы юзаю для такого, в этом случае удобно.
<pre>
(ns tr.lib.futures)
(defmacro futures
[n & exprs]
(vec (for [_ (range n)
expr exprs]
`(future ~expr))))
(defmacro wait-futures
[& args]
`(doseq [f# (futures ~@args)]
@f#))
;; HOWTO USE
;(defn sleeper []
; (Thread/sleep 1000))
;; Threaded code, will run 1 second
;(defn test-futures []
; (wait-futures 1
; (sleeper)
; (sleeper)
; (sleeper)
; (sleeper)))
;(time (test-futures))
;; Original single thread code, 3 seconds
;(defn test-simple []
; (sleeper)
; (sleeper)
; (sleeper))
;
;(time (test-simple))
</pre>
Ещё удобно, конечно, залипания сокета у биржи убирать (ни exceptions, ничего не выкидывается( просто рестартуя части программы через mount из scheduler внутреннего, тоже классно. Живая просто штука)
Да, тема интересная, финансы, обучался с потерями где-то полгода, делал ML на tensorflow, но в итоге для себя сделал вывод, что оно там не работает. Гонял по истории - будь здоров. То есть оно будет постоянно учиться, это супер, а я буду терять) В целом рынки манипулятивны и не созданы, чтобы зарабатывать, а чтобы терять и человек в этом смысле завсегда похитрее машины будет. Старая добрая торговля с плечом, но только не в промежутках 5-10-15 минут, а секунды сейчас решают, даже до 30 секунд норм. Есть интересный проект на эту тему в ML https://cryptomon.io/chart/bitstamp/btcusd/day#knneighhbors (я наблюдаю и тоже не алё, правда сейчас не доступен что ли уже, издохли...) Самое интересное было алгоритмы портировать на кложу, достаточно быстро. Но большая вариативность реализаций ещё оставляет задел на скорость, то есть я не использовал пока lazy, всё достаточно тупенько, тк я не гуру в кложе.
Сейчас дочитываю Joy of Clojure (на половине), второе издание, мозгодробительная книжка, очень вставляет и подача и уже что не для новичков. Наконец-то всосал теорию что такое трансдьюсеры, раньше как-то не ложилось в голову обычного императивного программиста. А всего-то делов - этож именованый набор трансформирующих функций без коллекций (map, reduce итп) Самое сложное было сознание изменить от ООП к data flow, на первых этапах даже apply вызывал непонимание, не говоря уже о juxt. Но как-то рассосалось.
В joy of clojure этот метод обучения назывался "Пить из пожарного гидранта", когда читаешь всё подряд по теме жадно. А оно там само потом всплывает или осознаётся позже.
Напишите ваш опыт... а то я одинок в целом, свои задачи решаю и ок.
Язык обалденно вставляет в первые дни, много времени потратил на emacs, хотя может и зря, он мне был нужен реально только в мегасложных отладках (cider) но это было нужно три раза. Обычно не заморачиваясь, cursive + repl было бы вполне достаточно (+ dbg макросы могу поделиться, наверное они распостранены). Сейчас emacs бы пропустил, хотя многие не согласятся, но полгода, ебать, мне уже сорокет лет, мне не до того.
Язык внешне обманчив, он глубок. Во-первых, я не зная java и jvm полез. Это вообще не обломало, interop хорош, тот же знакомый ООП, мне какая разница - есть интерфейсы и есть. гугли либы которые нужны, а там видно будет. Мне нужно решение задач, а не дрочка. Но сама кложка ой как глубокое озеро. 5 часов пишешь 20 строчек, но какие 20 строчек! Да, иногда сложнее для рефактора, но надо больше читать чужого кода, он всегда читается понятно. Любой чужой код на кложе читается легко, благодаря ns правильному. Такого я ранее не видал.
ох, как радостно и приятно слышать заинтересованность в русском комьюнити, у нас там слака активная, но мне некогда общаться, я из тех людей, что любят тишину и документацию. Прошу принять, что я нахожусь на определенном этапе понимания кложки, который может не совпадать с вашим и прошу простить заблуждения и готов учиться.
ну про тип list я готов много рассказывать. это басис лиспов
и то не факт, что я всё понял еще. Это просто данные, можно сказать, что это "code forms"
(code form) -> волшебное дрочево, самая мякотка, писечка лиспов
Многие люди понимают неверно лисп подобные языки как последовательность операций, как везде,
но нет! Это просто данные (* x y) = это просто список с функцией в самом начале и аргументами далее
А почему? что вообще есть лист? Я тут сделал для себя небольшую шпаргалку, ну как сделал, она в разработке по всем типам данных, но вот по листу - это https://i.gyazo.com/7bdb2497fdc80787ef95ae411ecc43d3.png
то есть у листа нет индекса, в отличие от вектора.
Примитив нам дан простой - это по сути стек
list - это все, что "между скобочек", мне нравится как называется функция (calling position)
и что есть по сути list? Это список, который отдаётся ну пусть эвалуатору (омг), и он его процессит.
Да, в кложке просто принято брать первое x в листе как функцию и применять ее к последующим аргументам, но это не обязательно.
Мы можем и просто отдать как есть с помощью апострофа - это значит евалуатить не надо '(x)
Как с точки зрения языка - это просто огонь - передавать языковые конструкции имхо как данные, и делать с ними что хошь. Нигде нет таких вольностей. Это же просто списки! просто тип данных. Это для меня было просто бомбезно - просто взять и передать кодоформы как данные куда-то в другой модуль. Похоже, на eval в других языках, но это не так. ведь данные можно трансформировать, да еще и иммутабельно, серъезно? Прям передать класс кодом? хаха
Вот это вот вещь! Метапрограммировыание.
Макросы в кложке тоже подлая тема, по сути, чем реже они используются, тем читабельнее код. Ну заюзал я из для многопоточности, всё, харе.
Конечно, и в core много макросов, например, let очень интересно почитать, но по сути в работе оно не особо и надо.
>у нас там слака активная
Ты про clojurians? Я там гдет полгода назад был, и в русском канале там было довольно тихо.
> мне некогда общаться, я из тех людей, что любят тишину и документацию.
Понимаю, сам такой.
> Вот это вот вещь! Метапрограммировыание.
Ну, твоё писание кипятком от форм лиспа я могу понять, у меня такое же было при обучении по SICP, но теперь я хочу понять, где эту мякотку можно реально применить, помимо "мам, смотри, как я могу!". Как я понимаю, одно из применений - макросы, но про макросы в SICP'е ничего нет.
Блядь, сперва прочитал как "cryptomoron", кек. Отличное название для стартапа.
>>276566
Джой оф кложи - это не для начинающих, угу. Как вторая книжка зато отлично заходит.
>именованый набор трансформирующих функций без коллекций
В выделенном как раз вся фишка. Многие вот это вообще ни в какую не понимают, даже в итт треде вроде были такие, лол.
>>276568
>читаешь всё подряд по теме жадно. А оно там само потом всплывает
STOP... HAMMOCK TIME
Про имакс согласен, в принципе он нахер не нужен, когда кложу изучаешь. У многих такое впечатление создается, что типа без имакса на кложе писать - это не то, ну так это хуйня полная. Емнип, сами чуваки из когнитекта пишут как раз в курсиве. Но я на имакс подсел еще до кложи, и это разумеется единственная среда разработки белого человека :3
>Но сама кложка ой как глубокое озеро.
Мне нравится, что там все фичи отделены друг от друга. Например, ты можешь спокойно писать код, вообще не зная, что такое макросы. Или стм\агенты\волатайл. Или полиморфизм - ты можешь даже не знать про протоколы и юзать мультиметоды, или наоборот, и у тебя ничего не сломается, все это отдельно. То есть нет такого, как в джаве (или хаскеле), где все фичи языка завязаны на одну конструкцию, и тебе надо сразу все в себя впихать, и только после этого ты можешь писать хоть какой-то код. А тут можно делать по принципу "херачишь код, понадобилась фича - разобрался". По сути самые основы языка (тот же синтаксис) можно рассказать за пару часов, ну и плюс конечно еще надо задрочить стандартную библиотеку и преобразования данных в функциональном стиле. А после этого просто берешь и делаешь, минимум ненужной хуиты, ебли с типами, абстрактбинфакторифасадсинглтонов и т.п. Берешь и делаешь.
Вот это кстати самое главное, что потом бросается в глаза в других языках, лол. Особенно когда какой-нибудь чтмл не в хиккап-синтаксисе править - это же просто пиздец, сидишь и думаешь: какой мудак это все придумал? Есть же очевидное, простое, удобное решение - нет, не хочу скобочки, хочу говно жрать. Хипсторы ебаные...
В кложе точно такие же макросы, как в кл (негигиенические), плюс немного сахарка для удобства (типа автодженсимов). Ты наверное со схемой перепутал, там "кастрированные" на самом деле нет по сравнению с кл\кложей макросы.
>>276885
По-моему макросы нужны в первую очередь для либописателей. Ну и просто без них либо бы все тормозило, как в руби, либо была бы куча бойлерплейта. С ними довольно легко выстрелить себе в ногу и сделать протекающую абстракцию, но в том и фишка, что на кложе они по сути не нужны просто для написания программ - ты их будешь только использовать в основном, а писать их будут всякие ребята, которые запилили тебе core.async, core.match, core.logic, тот же om, ну и т.п. Плюс мне нравится, что допустим вот есть либа, которая что-то делает, и там в ридми автор говорит мол вот у нас есть основная абстракция qux, мы все через нее делаем, и потом в коде ты берешь и пишешь: (defqux ...) - то есть индирекции меньше, читать проще, все straight to the point. Есть такое мнение, что типа чем более низкоуровневый язык, тем больше в коде на нем упоминаний не относящихся к домейну вещей, ну и наоборот соответственно. Вот тут как раз про это.
>>276908
tl;dr: макросы - это штука, которая позволяет добавить в язык поддержку асинхронности библиотекой, а не изменением компилятора. То есть повышается модульность программ.
К теме гомоиконности, из соседнего треда:
>И что за хуйня у вас там с макросами творится https://www.scala-lang.org/blog/2017/10/09/scalamacros.html ? Типа scala.reflect нахуй потому что Dotty в них не может, Idea тоже не может, поэтому Scalameta. Но теперь и Scalameta нахуй, переписываем всё по новой под scala.macros? Может уже подсмотрите, как правильно делать, чтобы не перехуячивать всю кодобазу по два раза за год?
кек
>>276998
В куче видео смотрел и в целом понятно, что макросы - это протекающая штука, что она оторвана от остальной кодебазы (точно про либы, первый макрос который я прочитал и понял - это let) как бы и это уже местечковое и совершенно не нужно их использовать повсеместно.
>>276908
Я из архива её всю прочитал на одном дыхании за несколько дней https://clojurians-log.clojureverse.org/clojure-russia
Когда это было там, пару лет назад я упарывался за фронтенд и сделал биндинги к chrome-reduxdevtools
https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd?hl=ru
тут https://gitlab.xet.ru/publicpr/clojurescript-redux/tree/master (там весь редукс на пару строк на самом деле на мультиметодах), больше пробмел передавать всё в chrome js extension, имитация иммутабельности, блин
но после этого, я понял, что значительно охладел к фронту, всё же слишком много иботни было с переиспользованием реакт компонентов, а писать всё с нуля...
Ну то есть из практического для фронтендеров: есть такая штука, как http://cljsjs.github.io/ но по факту там старьё и надо самому импортить.
>В куче видео смотрел и в целом понятно, что макросы - это протекающая штука
Ну я бы не сказал что это обязательно так (when вроде нигде не протекает, лол), но ее очень легко сделать протекающей. А так да, основное правило макрописателей - don't write macros ну или don't write a macro if a function will do, если для зануд
>>277856
В последних версиях ужеж вроде впилили поддержку es6 импортов и npm (ну и плюс в shadow-cljs это давно было, но она какая-то больно жручая, я ее толком не пробовал)
Двачую адеквата.
>абстрактные вещи
>подробно объяснял все минут 10
> а потом его собеседник в ответ -
Апи не нужно
@
А вот у нас экшены это функции
@
Ух бля, давайте джунов пообсуждамаем, а давай
@
Кто убил джунов
@
Как джуну найти первую работу
@
Хороши ли джуны
@
И т.д.
Я хз кому это может быть интересно...
Я про первый выпуск говорил, але.
Они же, если мне память не изменяет, несколько месяцев тому кложуриста искали. Видать, тот, которого они нашли, понял, что придётся не пиздеть всем, как же хороша кложа, а реально писать на ней кот, и тихо слился.
Впрочем, вбросьте потоньше это к скалистам, у них по любому подгорит..
Кложуристы, конечно, сверхлюди, тут спору нет, но ты правда считаешь, что ровно одного кложуриста достаточно, чтобы пермаментно тащить все проекты компании?
>kotlin
So much for the hype, кек. Скалку конечно жалко (алсо, так вроде и не скажешь). Хотя в принципе меня устраивает: java8 + clojure, больше на жвм ничего и ненужно.
Скорее вин, чем фейл.
Анон, зайди, бампни, (по-братски)
Сегодня Learning Clojure: comparing with Java streams
https://blog.frankel.ch/learning-clojure/5/
>https://github.com/lacuna/bifurcan/blob/master/doc/comparison.md
читал в тви у Зака анонс, крутая работа.
"лучше чем сам никто тебя не затроллит"
вот так вот - это тру?
понравился ряд постов относительно свежих чувака с medium
https://medium.com/@kirill.ishanov там посты посвящённые re-frame + spec, очень полезно, я переписал свой стек вдохновясь.
Я не Кирилл, дай бг ему здоровья) Сделал хорошо, чо ты.
Взял халтурку, на C#, xamarin, чот пописываю на новогодние праздники, делать нечего, пребываю в унынии оттого, как c# рпники пруцца от своего LINQ, Типа вот мы по данным ищем как по SQL, запросами. Удовольствия - 0, но бабки есть бабки, подписался, думал, поищу что-то новое.
ООО, это просто нечто, хыхы, типа https://ru.wikipedia.org/wiki/Language_Integrated_Query
WHAT??? И это на таком примитивном уровне находится до сих пор в 2019 году.
А если у тебя всё данные, и код, (спасибо кложке)то уж явно проблемы такие были решены, тащусь от
https://github.com/nathanmarz/specter
или
https://github.com/boxed/instar
объективно жаль сишарпников, надо отрыгнуть.
Есть интересный проект, https://github.com/arcadia-unity/Arcadia
unity кложурка, откуда я собственно, и приперся с с#
но в целом, это пока не территория кложуры.
cljs+react-native на мобилках норм (но дев-экспириенс - уг), у статус.им именно так все крутится (и они еще пилят порт реактнейтива для десктопа, их мобильная прога уже даже запускается под линуксом)
>>337371
А что в консоли браузера? У тебя коннекта между реплом и страницей нет, а почему - тут хз, надо больше инфы.
Чо, перекат пилить?
Накатил figwheel, там все работает.
>>1
Ну и где перекат?
Пикрелейтед - моё актуальное лицо, когда прочитал про макрос loop в Common Lisp.
Серьёзно, что за нахуй? DSL для циклов с условием в стандарте? Не могли, как в концептуально стройной няшной Scheme сделать - вот тебе TCO, вот тебе named let, и крутись как хочешь. Нет блядь, надо нахуевертить, чтобы как в C++ было, только со скобочками))))))))))
Ёб твою мать, ещё и с тредом проебался. Спасибо Абу за прекрасно свёрстанный каталог тредов, блядть.
Вы видите копию треда, сохраненную 4 марта 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.