This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-03-05
Channels
- # beginners (3)
- # boot (205)
- # cider (41)
- # clojars (1)
- # clojure (76)
- # clojure-colombia (1)
- # clojure-dusseldorf (3)
- # clojure-russia (314)
- # clojure-sg (1)
- # clojurebridge (1)
- # clojurescript (115)
- # css (2)
- # cursive (5)
- # editors (2)
- # funcool (2)
- # hoplon (18)
- # jobs (62)
- # jobs-discuss (28)
- # ldnclj (1)
- # leiningen (10)
- # mount (9)
- # off-topic (4)
- # om (93)
- # parinfer (10)
- # proton (1)
- # re-frame (19)
- # ring-swagger (18)
всем привет. кто-нибудь пробовал hugsql ? http://www.hugsql.org
вопрос: кто-нибудь видел пример как делать join?
@prepor: есть разница между https://github.com/jaked/ocamljs и https://github.com/bloomberg/bucklescript ?
есть js_of_ocaml, он транслирует байткод окамловый в жс (такой же как и другие генераторы — ублюдочный %) ) bucklescript — бэкенд окамл компилятора, требует соот-но патченного ocamlc/ocamlopt
также они нацелены на более тесную интеграцию и использование камлокода из жса, поэтому сразу генерят пригодное для export/require и всей этой жс камарильи
@az: да, текущий и работающий варианта это js_of_ocaml. но у него местами ублюдочный интероп (ну и не читаемый жс, хоть это и можно пережить). bucklescript очень перспективный, но он пока не готов, чуваки активно пилят
почему "бекенд окамл компилятора" -> патченный окамлси, я не знаю, по идее все можно делать и без патчей Но larhat тоже вроде не знает, так что я бы "требует соот-но" убрал )
@prepor: так а в чем проблема того, что за елм-ом, по сути, стоит один человек. за clojure-ой в самом начале был тоже Рич За эликсиром - Жозе. не все же языки сейчас с самого начала делаются гуглами и майкрософтами.
@prepor "требует соот-но" это про текущее состояние дел. Как окамлбилд вынесут отдельно, думаю причин патяить будет ещё чуть меньше
@rm видимо ты действительно это точно знаешь или просто так написал? вот послушай - https://www.youtube.com/watch?v=4o89mWFL-2A&feature=youtu.be&t=11
возможно, он все таки мексиканец, но не хочет расстраиваться по поводу того, что его испанская J читается остальными как английская J
@larhat: из фронтенда прямо сейчас же можно вытащить просто cmt-файлики и уже на них натравить свой бэкенд, разве нет?
@fxposter: тем, что кложа вышла из под пера Ричи уже готовым языком, который с тех пор практически не поменялся. elm же ни разу не готовый и "развивается". ну я и не говорю, что это "плохо", просто докладчик озвучил неправду. Якобы там комитет какой-то есть, есть роадмапы. Ни комитета, ни роадмапа, ни влияния комьюнити на язык, ничего нет. Это про так, а не по-другому )
Добрый день. Я из java. Нравится Lisp, буду переписывать небольшой проект на Clojure. Надеюсь пообщаться
> elm же ни разу не готовый и “развивается" @prepor: на самом деле развивается elm-html, который не является частью языка. я думаю то самое марио, которое Эван показывал в 2013м на стрейнджлупе до сих пор как есть запустится на текущей версии. А влияния комьюнити на кложуру, кажется, тоже если и было - то очень небольшое (по сравнению с тем же Эликсиром, как мне кажется), в Элме ситуация аналогичная.
@andmed: классно, мы уже слышали это в общей группе если будут еще и вопросы какие-то — велкам 😉
@andmed: привет, примерно тем же сейчас занимаюсь - но не переписываю, а пилю новые сервисы либо обертки к существующим
@ssesutchenkov: следуя примеру Николы сделал стэк на vim, на удивление работоспособно
я использую idea + cursive
ничем ни хуже. . мне просто удобно заодно и подтянуть vim... а вру, вроде с репл в идее неудобнее.
не знаю, я с vim не пробовал
@andmed: могу посоветовать использовать spacemacs. все плюшки вима + все плюшки имакса. clj-refactor вас приятно удивит 😉
@asolovyov: а есть альтернатива compojure-api? Кому что еще не понравилось из библиотек по опыту использования? )) Например, я сейчас ориентируюсь на Luminus - как оно ? Понимаю, что все зависит от задачи и личных предпочтений - буду благодарен за субъективную оценку и личный опыт )
@ssesutchenkov: я поверх ring-swagger и route-map себе сделал, в основном натаскал кода из pedestal-swagger
люминус хорошо чтоб взять и не париться, как решение все в одном; мне из него ничего не надо, так что я его не трогал
ага, пасиб. ну на мой взгляд без контекста задачи и каких нибудь метрик / бенчей большинство бесед будут в "формате чувств к"
как раз чтоб если кто-то говорит что клево - взять и самому покрутить
conjoin -- из доков"The 'addition' may happen at different 'places' depending on the concrete type" а зачем так?
@prepor в спейсмаксе все прелести вима плохо работают, если хочется использовать paredit (очень легко убить баланс скобок вимовским редактированием). Это нивелирует всю прелесть спейсмакса для тех кто пришел с вима, к сожалению. Уже второй раз пытаюсь перелезть
Как вы, опытные люди, относитесь к хаскелю? Он нашел свою нишу в пром. программировании? Он удобный? Или он только для учебы хорош и оч акадимичный? Я пока не шарю. Но показалось, что ocaml на слуху и подумалось, что он как комромисс: как хаскель, только удобнее и практичнее? Ваши мысли?
угу. а вот и ответ At least, the way I was taught is that “conj” is always constant time w.r.t. the collection being appended to. Since different collections have different internal storage mechanisms, that means that “conj” will do different things for different collections. Specifically, since a “list” is implemented as a linked-list, appending to the front is constant time. However vectors, which are backed by Java arrays, can only do a constant-time append by adding to the end.
@antonshwab: Если задача включает в себя много (очень много) нетривиальной логики, ошибки в которой стоят дорого, то Haskell очень хорош с точки зрения скорости написания кода.
Примеры можно привести? @dottedmag
@antonshwab: ghc
:)
@jetmind: там же стрикт-мод вроде работает и с вимовскими штуками уже, разве нет? а для "паредита" есть lisp-mode с шорткатами для smartparens
@dottedmag: ну это понятно ) А что нибудь из бизнеса?
@antonshwab: Из бизнеса все свой хаскелл прячут, у кого он есть.
@dottedmag: Зачем? Типа, преимущество не показывать?
@dottedmag: Вам можно верить? Сложно идентифицировать вашу компетентность)
@dottedmag: Всмысле я не ставлю ее под сомнение. Просто не знаю
И еще. Что в довесок к clojure изучать из языков, чтобы прокачаться?
Go лол)
Функционально)
былоб чо там учить в это го...
можно скалу изучить - там все есть из всех существующих языков)
Или так. Что обычно идет вместе с clojure? Помоему это стэк называется.
clojureScript!
базовых знаний js хватает, чтобы clojurescript использовать?
@fxposter: А чем там эта поддержка лучше чем в кложуре? alt! от массива как не было возможно в этом вашем го, так и нет, фе
@antonshwab: связки экосистем clojure + clojurescript за глаза хватит. Не надо ломать голову scala - будет только разочарование
тем что она в рантайме и ты можешь как угодно абстрагировать код работы с каналами в функции, а не делать все в одном единственном lexical scope?
go это для devops'ов. оно вам нужно?
@antonshwab: Хватает какое-то время. Впрочем, javascript не такой уж и сложный, его тоже можно поизучать. Хотя бы чтобы понять "как не надо делать".
ОК. Принял к сведению) Спасибо.
@fxposter: А можно пример? Я знаю что в кложуре макрос да, но никто не мешает передать канал из одного места в другое уже в рантайме, навесить трансдюсеров и все такое.
попробуй асбтрагировать raw-value (<- channel) value (process-value raw-value) в одну функцию value (read-value-from channel)
@artemyarulin: через рефлексию можно
@az: ну go пилит google и много devops тулзов, включая докер разрабатываются на go
@az: делать большие проекты на go гораздо труднее чем на clojure + clojurescript
@fxposter: они прекрасно абстрагируются. а в том самом го как раз операции с каналами НЕЛЬЗЯ абстрагировать
кстати вот если именно вопросы к го макросу и лексическому скоупу то никто не мешает все в рантайме делать БЕЗ макросов вообще:
(defn f [ch]
(let [out (chan 1)]
(pipeline 1 out (filter even?) ch)
out)
@fxposter: чего в ней кривого? у тебя контейнер над данными. вытащить данные их которого нужно через <- . назови канал монадой, а go-макрос do-нотацией )
наверно ага, не понимаю проблемы сорян
@fxposter: в смысле непонятно? для того что бы контейнер сделать. тебя вопрос производительности волнует или что?
ну лично мне бы хотелось избежать везде пихать (chan) или (go) лишь бы иметь возможность как-то юзать эти каналы в отдельных функциях
тем более в смешанных окружениях, где у тебя что-то может быть блокирующим, а что-то нет
суть в том, что в go у тебя этот шедулинг и все остальное делается в рантайме. в кложуре - это делается в самом языке, но большую часть из этого ты не видишь, потому что оно на макросах. но сделать это так же как с поддержкой рантайма все равно не получится )
дак проблема то в чем? много кода? перформанс? лишние строчки?
шедулиншг в кор.асинк как раз можно подтюнить под себя, хз как в го
по поводу блокирующего или нет - выше ж был типичный пример того, как не стоит юзать async с @(http/get) - это просто показывает как люди это воспринимают
@artemyarulin: мы явно о разных вещах
Проблема в том, что синтаксический сахар макросов нарушает подстановочный инвариант: нельзя просто синтаксически вытащить кусок кода из функции.
дак зачем?
напиши еще одни макрос, problem solved
я, кстати, не говорю что без этого прям совсем нельзя жить это просто удобная вещь, на которую удобно полагаться, но которую нельзя решить без кастомного рантайма
трансдюсеры то народ использует? Они во мноних случаях избавляет от необходимости писать эти гогого
в следующей версии будут файберы вместе с мультикором, посмотрим что с этим получится )
с другой стороны - это как зависимость от коллбеков в js - тебе приходится во все большую часть системы вставлять эту “зависимость на асинхронность”, которую иначе просто решает рантайм
каждый раз когда мне говорят про го и про пере-использовать/абстрагировать я вспоминаю это https://gobyexample.com/sorting-by-functions и думаю о том что у меня 10 полей и плачу абстрагируй map|filter|group-by|partitian @fxposter без рефлексии ?
хочешь абстрагировать - сделай интерфейс comparer и реализуй его для всех типов, которые тебе нужны
т.е. ты не видишь здесь проблемы?
бонус будет, если ты сможешь сказать - в чем проблема такого подхода с точки зрения производительности
я прекрасно понимаю, что в go нет дженериков. как и в C. и люди без них там обходятся.
вот вот, каждый раз го девы грят одно и тоже - все работает же! Надо только написать вот тут, потом еще тут, реализовать для каждого типа, для каждого проперти
сделай interface Comparer { func Compare(other interface{}) {} } и реализуй его для любого типа, который тебе нужен. да, ты будешь всегда писать other.(YourType) в реализациях, но ты это напишешь один раз для каждой реализации сравнения, которую тебе все равно пришлось бы писать самому (даже если бы у тебя были дженерики)
можно ли в Go добавить дженерики настолько простые, чтобы можно было просто “делать коллекции” и все - вот в чем вопрос.
я думаю, если бы это было можно сделать более менее легко и не нагружать другие части языка из-за этого - может это и сделали бы
@fxposter: а в Go есть переменные? И есть ли иммутабельные коллекции?
просто я подозреваю, что просто так это сделать нельзя (либо что если сделать простые - сразу же начнут просить вариантности всякие)
вопрос
мне вот больше интересно посмотреть на иммутабельные коллекции в чем-то типа rust, где нет runtime и нельзя просто так оставить мусор в надежде что старую версию кто-то вместо тебя удалит
я в последнее время не смотрел, может народ уже и сделал. мне просто не кажется, что это вообще возможно.
я могу себе представить иммутабельные коллекии на refcount-ах, но тогда у тебя эти refcount-ы вообще везде должны быть, наверное...
хз, я не настолько крутой, чтобы до конца понимать, как такое можно выразить в расте 😞
@prepor: ну по сути мы вместо того чтобы специализироваться на типа в Go можем сделать то, что уже десятилетиями делают OOP-шники - и ввести интерфейсы
@fxposter: иммутабельные коллекции сделать - считай половина языка написать. они являются пререквизитом для качественной concurency модели. если есть переменные и коллекции мутабельные, тогда это язык PLOP. нужно много думать о синхронизации.
ой, ну не надо слушал я все доклады Рича. у него крутые доклады. он прав во многом (может и во всем, просто я не во всем разбираюсь), но “являются пререквизитом для качественной concurency модели” - это не так
CSP при наличии только одного механизма коммуникации - через каналы - решат ту же проблему
го кста контроллирует если я снаружи начну все мутировать?
immutable это не Ричи, не он придумал их
а ок, он там вроде есть какой контроль прям при компиляции аж?
ну, чуть полегче, но там есть полный доступ ко всему - мютексы, потоки, race condition-ы
compile time concurrency checks
да? наврал значит, ну тем более тогда ГОвно! 😄
а вот
@fxposter: смотри, если у тебя мутабельная коллекция ты должен как-то синхронизировать и чтение и запись. тут даже AtomicReference не очень поможет, если какой-то другой поток упорет коллекцию без
я про race detector, он помогает чем?
синхронизации
да неа, мы тут просто привыки что все immutable и компилятор (апи) нам тупо не даст ничо изменить просто так
а тут 100500 способов отстрелить себе ногу
вот честно - в кложуре тебе каждая библиотека через раз - тоже способ отстрелить себе ногу
@fxposter: Дак race detector он чо делает прям магического? Я думаЛ это прям главная фича
а если не шарить? это через акторы? а там разве не последовательный доступ будет на чтение и запись? если чтение коллекции будет производится на сервере с 32 ядрами, например? они последовательно читать будут?
@mike1452: это у тебя из реальной жизни примеры мутации огромной коллекции в 32 потока с иммутабельными структурами данных?
просто интересно, как ты будешь иммутабельную коллекцию мутировать в 32 потока с одним atom-ом, и сколько у тебя будет retry-ев
банк, сервер, таблица счетов, операция всегда двойная: списать с одного счета и записать в другой + всякая служебная фигня
по-моему реальный пример
так, не атомом мутироваться будет. через STM
@fxposter: Слушай, а вот вообще - как тебе в го живется без функционального программирования? Или ты считаешь что го достаточно функционален?
STM на иммутабельных коллекциях быстрее однако, чем на мутабельных
@mike1452: да, я смотрел доклады Рича и не надо рассказывать, что это нельзя сделать через локи. более того - если у тебя до этого момента не было подобного рода операций, то с довольно большой вероятностью, до этого все данные хранились в atom-ах, и после того как эту операцию стало нужно реализовывать - то прийдется переходить на ref-ы и переписывать кучу кода
@artemyarulin: у меня последние я продукта, которые я делал были на clojure
@mike1452: более того - то, о чем ты говоришь можно сделать и на atom-е. или на локах. везде свои преимущества и недостатки.
дело не в коде, а то, что STM позволяет писать линейный код не думая о локах вообще. то есть средней руки программист просто напишет код. Это называется сделать быстро, не особо заморачиваясь. а локи это же про конкаренси. мы люди тяжело думаем когда пытаемся думать как оно там будет в конкаренси
@mike1452: а вот если у тебя операция, которая каким-то образом создает сайд-эффекты - то ref-ы тебе ну вообще не помогут
агенты + STM как раз для этого
да, мы видели как программисты писали в atom “assoc if not exists” для side-effecting функций. где-то неделю-две назад.
@fxposter: я просто хейтер го, поэтому сорян если грубо выше было:) Но вот если без религии - ну я не могу представить себе счас язык без функциональщины. Поэтому раст тот-же наше все, а вот го ну прям ну вообще никак.
горячо сегодня в канале - сразу видно, парни к 8 марта готовятся )))
@artemyarulin: честно - я на руби писал и много пишу. от функциональщины там - Enumerable и все. все нормально. бывают проблемы из-за мутабельных строк, не скрою. за последние 4 года - 1 раз были проблемы.
@fxposter: Чо правда? Мне казалось что руби функциональный язык не?
понятие “функциональный язык” ну ОЧЕНЬ расплывчатое. если руби функциональный - тогда и Smalltalk функциональный?
@dottedmag походу та цитата вообще неверна - в основе векторов clojure не массивы а деревья, откуда O(1) для conj взято, непонятно. вообще с time complexity не очень понятно.
я превожу определение функционального языка так
1. Чистые функции: - результат зависит только от аргументов. - от одних и тех же аргументов - одни и те же результаты. - состояние программы явно задано только аргументами функций
2. Функции как объекты 1 класса: - функции можно сохранить как структуру данных - функции можно передавать как параметры - функции можно возвращать как результат - функции можно динамически создавать во время исполнения
я на баше такое смогу написать)
3. Функции высших порядков 4. Упор на реккурсию
лол))
вот эти 4 свойства определяют функциональный язык. но это ИМХО
читал месяц назад наверно статейку (не могу счас найти) - what is the functional language или типа того. Дак там было сказано что функциональный язык этот тот на котором легко писать фунциональщину и который подталкивает тебя к этому. Именно поэтому мол JS - не Ф, а всякие кложуру и хаскели - да
ну да, попробуй измени мутабельную переменную
ой, иммутабельную
сам язык, так сказать подталкивает к функциональному кодау
там всего 5 уровней. так что считайте O(1)
кстати раз уж тут про перформанс - я вроде помню патч в кложуру который автоматически генерил/использовал классы если в мапе 1-3 ключа всего (Tuple_1 или чота такое вспоминаю). Опять же есть defrecords которые создают классик на жаве и типо поднимают перформанс ибо обращение по филду быстрыее чем в мапе. Вопрос: Смысла нет получается делать defrecords с 2-3 полями?
сорян если как всегда все переврал и вообще глупость написал, "тока учусь”(с)
> Вопрос: Смысла нет получается делать defrecords с 2-3 полями? не очень понятно, как ты пришел к такому выводу
дада, я именно так и делаю
просто пытаюсь понять зачем мне может понадобиться defrecord и нашел тока один пока аргумент как перформанс. Но если есть тупл - то тож самое же будет, не?
ну я пришел к выводу как: - Тупл есть, использьзует филды, значит так же быстр
месяца 2, я до этого год на CLJS
так пажди, погуглю 😄
ну вот я тут видел https://chasemerick.files.wordpress.com/2011/07/choosingtypeforms2.png
@artemyarulin: defrecord нужен если хочешь использовать полиморфизм
это не актуальная картинка уже?
@mike1452: только не говори это слово при академиках или людях, юзающих хаскель или что-то подобное, потому что они тебя не поймут
@artemyarulin: видел картинку. вроде норм.
просто вот на картинке стрелка к defrecord - бла бла бла be associated with performance-sensetive code
точнее чуть выше
потому что в том числе доставать поле по индексу дешевле чем из мапы доставать по ключу
дак а возвращаясь к вопросу про туплы - defrecord будет работать быстрее все равно да?
ок понятно, спасибо