Clojurians
#clojure-russia
<
2016-03-05
>

This page is not created by, affiliated with, or supported by Slack Technologies, Inc.

mike145203:03:59

всем привет. кто-нибудь пробовал hugsql ? http://www.hugsql.org

mike145203:03:42

вопрос: кто-нибудь видел пример как делать join?

rm05:03:24

а в чем проблема? Пишешь себе какой угодно запрос. В этом же вся прелесть yesql/hugsql

rm05:03:15

(я пользуюсь yesql)

az07:03:33

последний генерирует менее ублюдочный js ?

larhat08:03:31

ocamljs это древность

larhat08:03:19

есть js_of_ocaml, он транслирует байткод окамловый в жс (такой же как и другие генераторы — ублюдочный %) ) bucklescript — бэкенд окамл компилятора, требует соот-но патченного ocamlc/ocamlopt

larhat08:03:25

и генерит жс поприличнее

larhat08:03:59

также они нацелены на более тесную интеграцию и использование камлокода из жса, поэтому сразу генерят пригодное для export/require и всей этой жс камарильи

asolovyov09:03:35

@nicola: спасыба

asolovyov09:03:32

@nicola: а релиз замутишь? )

asolovyov09:03:44

а, ты уже

prepor10:03:38

@az: да, текущий и работающий варианта это js_of_ocaml. но у него местами ублюдочный интероп (ну и не читаемый жс, хоть это и можно пережить). bucklescript очень перспективный, но он пока не готов, чуваки активно пилят

prepor10:03:08

почему "бекенд окамл компилятора" -> патченный окамлси, я не знаю, по идее все можно делать и без патчей Но larhat тоже вроде не знает, так что я бы "требует соот-но" убрал )

fxposter10:03:22

@prepor: так а в чем проблема того, что за елм-ом, по сути, стоит один человек. за clojure-ой в самом начале был тоже Рич :simple_smile: За эликсиром - Жозе. не все же языки сейчас с самого начала делаются гуглами и майкрософтами.

rm11:03:04

чувака за эликсиром зовут Хосе :)

larhat11:03:32

@prepor "требует соот-но" это про текущее состояние дел. Как окамлбилд вынесут отдельно, думаю причин патяить будет ещё чуть меньше

fxposter11:03:14

@rm видимо ты действительно это точно знаешь или просто так написал? вот послушай - https://www.youtube.com/watch?v=4o89mWFL-2A&amp;feature=youtu.be&amp;t=11

rm11:03:10

не лучше, чем он сам, да

rm11:03:32

он внезапно поляк чтоли

rm11:03:39

я думал, мексиканец какой-нибудь

rm11:03:04

возможно, он все таки мексиканец, но не хочет расстраиваться по поводу того, что его испанская J читается остальными как английская J

fxposter11:03:40

он из Бразилии :simple_smile:

fxposter11:03:06

но уже давно в Европе живет

fxposter11:03:22

но я не думаю, что это повлияло на то, как он себя называет :smile:

prepor13:03:56

@larhat: из фронтенда прямо сейчас же можно вытащить просто cmt-файлики и уже на них натравить свой бэкенд, разве нет?

prepor13:03:13

@fxposter: тем, что кложа вышла из под пера Ричи уже готовым языком, который с тех пор практически не поменялся. elm же ни разу не готовый и "развивается". ну я и не говорю, что это "плохо", просто докладчик озвучил неправду. Якобы там комитет какой-то есть, есть роадмапы. Ни комитета, ни роадмапа, ни влияния комьюнити на язык, ничего нет. Это про так, а не по-другому )

andmed15:03:20

Добрый день. Я из java. Нравится Lisp, буду переписывать небольшой проект на Clojure. Надеюсь пообщаться

fxposter15:03:15

> elm же ни разу не готовый и “развивается" @prepor: на самом деле развивается elm-html, который не является частью языка. :simple_smile: я думаю то самое марио, которое Эван показывал в 2013м на стрейнджлупе до сих пор как есть запустится на текущей версии. А влияния комьюнити на кложуру, кажется, тоже если и было - то очень небольшое (по сравнению с тем же Эликсиром, как мне кажется), в Элме ситуация аналогичная.

prepor15:03:14

@andmed: классно, мы уже слышали это в общей группе :simple_smile: если будут еще и вопросы какие-то — велкам :wink:

prepor15:03:56

@fxposter: меняется синтаксис, меняется система типов. и будет меняться еще больше.

ssesutchenkov15:03:31

@andmed: привет, примерно тем же сейчас занимаюсь - но не переписываю, а пилю новые сервисы либо обертки к существующим

andmed15:03:32

@ssesutchenkov: следуя примеру Николы сделал стэк на vim, на удивление работоспособно

ssesutchenkov16:03:27

я использую idea + cursive

andmed16:03:08

ничем ни хуже. . мне просто удобно заодно и подтянуть vim... а вру, вроде с репл в идее неудобнее.

ssesutchenkov16:03:48

не знаю, я с vim не пробовал

asolovyov16:03:53

@rm: jose по-испански хосе, а по-португальски - жозе

rm16:03:49

блин, я вспомнил! Моуриньо же

rm16:03:04

день лингвистики в чатике

prepor16:03:26

@andmed: могу посоветовать использовать spacemacs. все плюшки вима + все плюшки имакса. clj-refactor вас приятно удивит :wink:

ssesutchenkov16:03:03

@asolovyov: а есть альтернатива compojure-api? Кому что еще не понравилось из библиотек по опыту использования? )) Например, я сейчас ориентируюсь на Luminus - как оно ? Понимаю, что все зависит от задачи и личных предпочтений - буду благодарен за субъективную оценку и личный опыт )

asolovyov16:03:37

@ssesutchenkov: я поверх ring-swagger и route-map себе сделал, в основном натаскал кода из pedestal-swagger

asolovyov16:03:56

люминус хорошо чтоб взять и не париться, как решение все в одном; мне из него ничего не надо, так что я его не трогал

asolovyov16:03:06

honeysql, кстати, прям суперклевый

asolovyov16:03:30

говоря о чувствах к библиотекам :simple_smile:

ssesutchenkov16:03:51

ага, пасиб. ну на мой взгляд без контекста задачи и каких нибудь метрик / бенчей большинство бесед будут в "формате чувств к" :simple_smile:

ssesutchenkov16:03:34

как раз чтоб если кто-то говорит что клево - взять и самому покрутить

andmed16:03:57

@prepor: Ok спасибо. можно на ты

andmed18:03:55

conjoin -- из доков"The 'addition' may happen at different 'places' depending on the concrete type" а зачем так?

jetmind18:03:12

@prepor в спейсмаксе все прелести вима плохо работают, если хочется использовать paredit (очень легко убить баланс скобок вимовским редактированием). Это нивелирует всю прелесть спейсмакса для тех кто пришел с вима, к сожалению. Уже второй раз пытаюсь перелезть

antonshwab18:03:44

Как вы, опытные люди, относитесь к хаскелю? Он нашел свою нишу в пром. программировании? Он удобный? Или он только для учебы хорош и оч акадимичный? Я пока не шарю. Но показалось, что ocaml на слуху и подумалось, что он как комромисс: как хаскель, только удобнее и практичнее? Ваши мысли?

andmed18:03:38

угу. а вот и ответ 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.

dottedmag18:03:54

@antonshwab: Если задача включает в себя много (очень много) нетривиальной логики, ошибки в которой стоят дорого, то Haskell очень хорош с точки зрения скорости написания кода.

dottedmag18:03:56

Если же логики мало, а много plumbing'а, то смысла теребить монады нет.

andmed18:03:08

хотя, про наращивание массива в constant time спорно

antonshwab18:03:10

Примеры можно привести? @dottedmag

dottedmag18:03:38

@antonshwab: ghc :)

prepor18:03:08

@jetmind: там же стрикт-мод вроде работает и с вимовскими штуками уже, разве нет? а для "паредита" есть lisp-mode с шорткатами для smartparens

antonshwab18:03:43

@dottedmag: ну это понятно ) А что нибудь из бизнеса?

dottedmag18:03:03

@antonshwab: Из бизнеса все свой хаскелл прячут, у кого он есть.

antonshwab18:03:58

@dottedmag: Зачем? Типа, преимущество не показывать?

dottedmag18:03:10

@antonshwab: да

dottedmag18:03:44

@andmed: Наращивание массива - амортизированное константное время.

antonshwab18:03:56

@dottedmag: Вам можно верить? :simple_smile: Сложно идентифицировать вашу компетентность)

antonshwab18:03:26

@dottedmag: Всмысле я не ставлю ее под сомнение. Просто не знаю

dottedmag18:03:30

Ну, я не первый год в свободном плавании.

az18:03:08

:grinning:

antonshwab18:03:57

И еще. Что в довесок к clojure изучать из языков, чтобы прокачаться?

dottedmag18:03:09

А в каком направлении прокачаться?

antonshwab18:03:08

Функционально)

fxposter18:03:14

rust/go/elixir + elm/typescript :simple_smile:

fxposter18:03:35

а, еще c#/f# и .net core clr довольно интересные

artemyarulin18:03:39

былоб чо там учить в это го...

artemyarulin18:03:00

можно скалу изучить - там все есть из всех существующих языков)

antonshwab18:03:04

Или так. Что обычно идет вместе с clojure? Помоему это стэк называется.

artemyarulin18:03:13

clojureScript!

fxposter18:03:31

Go интересен нативной поддержкой CSP и тем, как они улучшают GC :simple_smile:

antonshwab18:03:39

базовых знаний js хватает, чтобы clojurescript использовать?

artemyarulin18:03:43

@fxposter: А чем там эта поддержка лучше чем в кложуре? alt! от массива как не было возможно в этом вашем го, так и нет, фе

mike145218:03:18

@antonshwab: связки экосистем clojure + clojurescript за глаза хватит. Не надо ломать голову scala - будет только разочарование

fxposter18:03:37

тем что она в рантайме и ты можешь как угодно абстрагировать код работы с каналами в функции, а не делать все в одном единственном lexical scope?

mike145218:03:37

go это для devops'ов. оно вам нужно?

dottedmag18:03:42

@antonshwab: Хватает какое-то время. Впрочем, javascript не такой уж и сложный, его тоже можно поизучать. Хотя бы чтобы понять "как не надо делать".

az18:03:31

Почему go доя devops ?

antonshwab18:03:05

ОК. Принял к сведению) Спасибо.

artemyarulin18:03:10

@fxposter: А можно пример? Я знаю что в кложуре макрос да, но никто не мешает передать канал из одного места в другое уже в рантайме, навесить трансдюсеров и все такое.

fxposter18:03:29

(go (let [raw-value (<- channel) value (process-value raw-value)]))

fxposter18:03:56

попробуй асбтрагировать raw-value (<- channel) value (process-value raw-value) в одну функцию value (read-value-from channel)

fxposter18:03:18

этого нельзя сделать без поддержки рантайма

prepor18:03:23

@artemyarulin: через рефлексию можно

fxposter18:03:27

и создатели это прекрасно понимают

fxposter18:03:54

но с другой стороны все остальное оказалось можно сделать в виде библиотеки

mike145218:03:54

@az: ну go пилит google и много devops тулзов, включая докер разрабатываются на go

prepor18:03:58

@fxposter: берешь и абстрагируешь. принимаешь канал, возвращаешь go-шку

dottedmag18:03:25

@prepor: Синтаксическая абстракция начинает течь на стыке, увы.

fxposter18:03:36

@prepor: и в итоге создаешь дополнительные каналы (и мусор) на каждый чих

mike145218:03:36

@az: делать большие проекты на go гораздо труднее чем на clojure + clojurescript

dottedmag18:03:42

Это не так страшно, но это просвечивающие детали.

fxposter18:03:04

т.е. ты можешь абстрагировать все, кроме именно операций с каналами

az18:03:10

Что кроме докера на го?

fxposter18:03:12

которые должны быть в лексическом скоупе

fxposter18:03:36

это вот такая особенность, ничего с этим не сделаешь

prepor18:03:44

@fxposter: почему они "дополнительные" и почему мусорные?

prepor18:03:15

@fxposter: они прекрасно абстрагируются. а в том самом го как раз операции с каналами НЕЛЬЗЯ абстрагировать

prepor18:03:21

потому что генериков нет

prepor18:03:28

и вообще

fxposter18:03:36

value (<- (processed-value-from channel))

fxposter18:03:54

ты всегда должен оставлять работу с каналами в лексическом скоупе

fxposter18:03:15

вот эти <-, ->

prepor18:03:17

твой пример как раз в го нельзя абстрагировать

prepor18:03:24

а на кложе вот сам написал как )

fxposter18:03:56

это кривая абстракция, которая генерирует мусор )

artemyarulin18:03:03

кстати вот если именно вопросы к го макросу и лексическому скоупу то никто не мешает все в рантайме делать БЕЗ макросов вообще:

(defn f [ch]
(let [out (chan 1)]
   (pipeline 1 out (filter even?) ch)
   out)

fxposter18:03:06

в go да, без дженериков тяжко :simple_smile:

prepor18:03:12

@az: ну хороший софт правда пишут. консул, терраформ. но тяжко им ох как

fxposter18:03:03

вот ты щас создал дополнительный канал непонятно зачем )

fxposter18:03:09

и мы о разных вещах

prepor18:03:26

@fxposter: чего в ней кривого? у тебя контейнер над данными. вытащить данные их которого нужно через <- . назови канал монадой, а go-макрос do-нотацией )

artemyarulin18:03:27

наверно ага, не понимаю проблемы сорян

prepor18:03:03

@fxposter: в смысле непонятно? для того что бы контейнер сделать. тебя вопрос производительности волнует или что?

fxposter18:03:04

@prepor: ну ты же не для монад core.async юзаешь :simple_smile:

fxposter18:03:58

ну лично мне бы хотелось избежать везде пихать (chan) или (go) лишь бы иметь возможность как-то юзать эти каналы в отдельных функциях

fxposter18:03:18

вот с quazar может еще получится, кстати

fxposter18:03:35

хотя хз, оно там какое-то сложное достаточно внутри

prepor18:03:50

это абсолютно нормаль типами (go / chan) определять интерфейс

prepor18:03:05

а не расчитывать на магию рантайма

prepor18:03:37

тем более в смешанных окружениях, где у тебя что-то может быть блокирующим, а что-то нет

fxposter18:03:54

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

artemyarulin18:03:41

дак проблема то в чем? много кода? перформанс? лишние строчки?

artemyarulin19:03:04

шедулиншг в кор.асинк как раз можно подтюнить под себя, хз как в го

fxposter19:03:06

по поводу блокирующего или нет - выше ж был типичный пример того, как не стоит юзать async с @(http/get) - это просто показывает как люди это воспринимают

prepor19:03:15

с quazar все получится, только толку от этого не шибко

fxposter19:03:35

@artemyarulin: мы явно о разных вещах :simple_smile:

dottedmag19:03:42

Проблема в том, что синтаксический сахар макросов нарушает подстановочный инвариант: нельзя просто синтаксически вытащить кусок кода из функции.

artemyarulin19:03:54

дак зачем?

dottedmag19:03:16

Так затем, что код внутри go-макроса ведёт себя не так, как код снаружи.

artemyarulin19:03:33

напиши еще одни макрос, problem solved :simple_smile:

dottedmag19:03:45

Т.е. внутри макроса не Clojure, а другой язык, похожий.

fxposter19:03:48

я, кстати, не говорю что без этого прям совсем нельзя жить :simple_smile: это просто удобная вещь, на которую удобно полагаться, но которую нельзя решить без кастомного рантайма

fxposter19:03:59

люди живут же

dottedmag19:03:07

Люди и с PHP живут :)

artemyarulin19:03:11

:simple_smile:

artemyarulin19:03:53

трансдюсеры то народ использует? Они во мноних случаях избавляет от необходимости писать эти гогого

prepor19:03:01

у этого подхода есть еще одно большое преимущество

prepor19:03:10

независимость от того самого рантайма )

fxposter19:03:17

это понятно :simple_smile:

prepor19:03:32

поэтому ровно тот же самый кор-асинк работает и в кложаскрипте

prepor19:03:50

"ровно тот же самый" в части разворачивания макроса во всяком случае

prepor19:03:21

точно так же монадические интерфейсы lwt в окамле комппилятся в жс

fxposter19:03:48

с этим согласен

prepor19:03:54

там тоже есть компайл-тайм сахар типа let%lwt res = getResult in doSomething res

prepor19:03:35

в следующей версии будут файберы вместе с мультикором, посмотрим что с этим получится )

fxposter19:03:04

с другой стороны - это как зависимость от коллбеков в js - тебе приходится во все большую часть системы вставлять эту “зависимость на асинхронность”, которую иначе просто решает рантайм

fxposter19:03:21

кстати, недавно статья на хабре была как раз об этом, только о C++

artemyarulin19:03:28

каждый раз когда мне говорят про го и про пере-использовать/абстрагировать я вспоминаю это https://gobyexample.com/sorting-by-functions и думаю о том что у меня 10 полей и плачу абстрагируй map|filter|group-by|partitian @fxposter без рефлексии ? :simple_smile:

fxposter19:03:39

и что ты этим хочешь сказать?

fxposter19:03:10

хочешь абстрагировать - сделай интерфейс comparer и реализуй его для всех типов, которые тебе нужны

artemyarulin19:03:33

т.е. ты не видишь здесь проблемы?

fxposter19:03:36

бонус будет, если ты сможешь сказать - в чем проблема такого подхода с точки зрения производительности :simple_smile:

fxposter19:03:11

я прекрасно понимаю, что в go нет дженериков. как и в C. и люди без них там обходятся.

artemyarulin19:03:13

вот вот, каждый раз го девы грят одно и тоже - все работает же! Надо только написать вот тут, потом еще тут, реализовать для каждого типа, для каждого проперти

fxposter19:03:18

нет, еще раз

fxposter19:03:29

сделай interface Comparer { func Compare(other interface{}) {} } и реализуй его для любого типа, который тебе нужен. да, ты будешь всегда писать other.(YourType) в реализациях, но ты это напишешь один раз для каждой реализации сравнения, которую тебе все равно пришлось бы писать самому (даже если бы у тебя были дженерики)

prepor19:03:10

ну реализуешь ты compare для int и чо дальше? )

prepor19:03:31

как тебе это поможет sort для списка интов сделать? )

fxposter19:03:36

у тебя функция sort будет принимать []Comparer

fxposter19:03:31

это все можно сделать. нужно просто понимать, в чем минусы этого.

fxposter19:03:58

да, с дженериками удобнее. и безопаснее.

fxposter19:03:37

можно ли в Go добавить дженерики настолько простые, чтобы можно было просто “делать коллекции” и все - вот в чем вопрос.

fxposter19:03:12

я думаю, если бы это было можно сделать более менее легко и не нагружать другие части языка из-за этого - может это и сделали бы

mike145219:03:36

@fxposter: а в Go есть переменные? И есть ли иммутабельные коллекции?

fxposter19:03:57

просто я подозреваю, что просто так это сделать нельзя (либо что если сделать простые - сразу же начнут просить вариантности всякие) :simple_smile:

fxposter19:03:05

@mike1452: это сарказм?)

mike145219:03:10

вопрос

fxposter19:03:18

да, нет

fxposter19:03:31

но коллекции ничто не мешает сделать. но это мало кому нужно.

prepor19:03:53

@fxposter: чот ты с []Comparer наебать меня пытаешься где-то чую!

fxposter19:03:58

:simple_smile:

fxposter19:03:29

мне вот больше интересно посмотреть на иммутабельные коллекции в чем-то типа rust, где нет runtime и нельзя просто так оставить мусор в надежде что старую версию кто-то вместо тебя удалит

prepor19:03:53

в расте есть рантайм

fxposter19:03:55

я в последнее время не смотрел, может народ уже и сделал. мне просто не кажется, что это вообще возможно.

fxposter19:03:59

в расте нет GC

prepor19:03:01

ну т.е. rc — это уже рантайм

fxposter19:03:13

ну ок, неправильно выразился

fxposter19:03:06

я могу себе представить иммутабельные коллекии на refcount-ах, но тогда у тебя эти refcount-ы вообще везде должны быть, наверное...

fxposter19:03:15

т.е. врапить все возвращаемые типы и т.д.

fxposter19:03:38

хз, я не настолько крутой, чтобы до конца понимать, как такое можно выразить в расте :disappointed:

prepor19:03:11

так вот, насчет наебать

prepor19:03:18

что точно помню

prepor19:03:38

скажем []int ты же не сможешь скормить в [] Comparer

prepor19:03:47

так ведь? )

fxposter19:03:50

да, копировать надо

fxposter19:03:19

@prepor: ну по сути мы вместо того чтобы специализироваться на типа в Go можем сделать то, что уже десятилетиями делают OOP-шники - и ввести интерфейсы

mike145219:03:30

@fxposter: иммутабельные коллекции сделать - считай половина языка написать. они являются пререквизитом для качественной concurency модели. если есть переменные и коллекции мутабельные, тогда это язык PLOP. нужно много думать о синхронизации.

fxposter19:03:02

ой, ну не надо :simple_smile: слушал я все доклады Рича. у него крутые доклады. он прав во многом (может и во всем, просто я не во всем разбираюсь), но “являются пререквизитом для качественной concurency модели” - это не так

fxposter19:03:48

CSP решает проблему concurrency, actor-ы решают проблему concurrency

fxposter19:03:05

внутри актора мутируй сколько влезет - там всегда 1 поток

fxposter19:03:38

CSP при наличии только одного механизма коммуникации - через каналы - решат ту же проблему

artemyarulin19:03:48

го кста контроллирует если я снаружи начну все мутировать?

fxposter19:03:54

не забывайте, что Ричу тоже нужно кложуру продвигать :simple_smile:

artemyarulin19:03:13

immutable это не Ричи, не он придумал их

fxposter19:03:16

нет, Go только дает тулзы, дальше - как в C

artemyarulin19:03:40

а ок, он там вроде есть какой контроль прям при компиляции аж?

fxposter19:03:42

ну, чуть полегче, но там есть полный доступ ко всему - мютексы, потоки, race condition-ы

artemyarulin19:03:01

compile time concurrency checks

fxposter19:03:12

ты с rust-ом не попутал?

artemyarulin19:03:28

да? наврал значит, ну тем более тогда ГОвно! :smile:

fxposter19:03:28

у go есть race detector, но я про него только читал, и это было давно

mike145219:03:34

@fxposter: смотри, если у тебя мутабельная коллекция ты должен как-то синхронизировать и чтение и запись. тут даже AtomicReference не очень поможет, если какой-то другой поток упорет коллекцию без

artemyarulin19:03:47

я про race detector, он помогает чем?

mike145219:03:48

синхронизации

fxposter19:03:54

@mike1452: почитай, что я написал

fxposter19:03:09

не шарь коллекцию

fxposter19:03:27

и не надо рассказывать что по другому “нельзя жить” :simple_smile:

fxposter19:03:38

но Ричу нужно показать что нельзя :simple_smile:

artemyarulin19:03:06

да неа, мы тут просто привыки что все immutable и компилятор (апи) нам тупо не даст ничо изменить просто так

artemyarulin19:03:21

а тут 100500 способов отстрелить себе ногу

fxposter19:03:06

вот честно - в кложуре тебе каждая библиотека через раз - тоже способ отстрелить себе ногу

artemyarulin19:03:12

@fxposter: Дак race detector он чо делает прям магического? Я думаЛ это прям главная фича

fxposter19:03:20

вон пример - проблемы Соловьева с http клиентом

fxposter19:03:34

второй пример - возьми zookeeper client и попробуй с ним совладать

fxposter19:03:52

“красивая теория о PLOP” - это прекрасно, я не спорю

fxposter19:03:58

и это хорошо когда это все есть

mike145219:03:14

а если не шарить? это через акторы? а там разве не последовательный доступ будет на чтение и запись? если чтение коллекции будет производится на сервере с 32 ядрами, например? они последовательно читать будут?

fxposter19:03:26

@mike1452: это у тебя из реальной жизни примеры мутации огромной коллекции в 32 потока с иммутабельными структурами данных?

fxposter19:03:46

просто интересно, как ты будешь иммутабельную коллекцию мутировать в 32 потока с одним atom-ом, и сколько у тебя будет retry-ев

fxposter19:03:56

теория это прекрасно :simple_smile:

mike145219:03:23

банк, сервер, таблица счетов, операция всегда двойная: списать с одного счета и записать в другой + всякая служебная фигня

mike145219:03:31

по-моему реальный пример

mike145219:03:03

так, не атомом мутироваться будет. через STM

artemyarulin19:03:19

@fxposter: Слушай, а вот вообще - как тебе в го живется без функционального программирования? Или ты считаешь что го достаточно функционален?

mike145219:03:23

STM на иммутабельных коллекциях быстрее однако, чем на мутабельных

fxposter19:03:51

@mike1452: да, я смотрел доклады Рича :simple_smile: и не надо рассказывать, что это нельзя сделать через локи. :simple_smile: более того - если у тебя до этого момента не было подобного рода операций, то с довольно большой вероятностью, до этого все данные хранились в atom-ах, и после того как эту операцию стало нужно реализовывать - то прийдется переходить на ref-ы и переписывать кучу кода

fxposter19:03:15

@artemyarulin: у меня последние я продукта, которые я делал были на clojure

fxposter19:03:28

@mike1452: более того - то, о чем ты говоришь можно сделать и на atom-е. или на локах. везде свои преимущества и недостатки.

mike145219:03:49

дело не в коде, а то, что STM позволяет писать линейный код не думая о локах вообще. то есть средней руки программист просто напишет код. Это называется сделать быстро, не особо заморачиваясь. а локи это же про конкаренси. мы люди тяжело думаем когда пытаемся думать как оно там будет в конкаренси

fxposter19:03:04

@mike1452: а вот если у тебя операция, которая каким-то образом создает сайд-эффекты - то ref-ы тебе ну вообще не помогут

mike145219:03:23

агенты + STM как раз для этого

fxposter19:03:53

да, мы видели как программисты писали в atom “assoc if not exists” для side-effecting функций. где-то неделю-две назад.

fxposter19:03:59

долго писали

artemyarulin19:03:08

@fxposter: я просто хейтер го, поэтому сорян если грубо выше было:) Но вот если без религии - ну я не могу представить себе счас язык без функциональщины. Поэтому раст тот-же наше все, а вот го ну прям ну вообще никак.

fxposter19:03:12

раз на 4-й вроде сделали правильно всем этим чатиком :smile:

mike145219:03:14

горячо сегодня в канале - сразу видно, парни к 8 марта готовятся )))

fxposter19:03:03

@artemyarulin: честно - я на руби писал и много пишу. от функциональщины там - Enumerable и все. все нормально. бывают проблемы из-за мутабельных строк, не скрою. за последние 4 года - 1 раз были проблемы.

artemyarulin19:03:59

@fxposter: Чо правда? Мне казалось что руби функциональный язык не?

fxposter19:03:58

понятие “функциональный язык” ну ОЧЕНЬ расплывчатое. если руби функциональный - тогда и Smalltalk функциональный?

andmed19:03:12

@dottedmag походу та цитата вообще неверна - в основе векторов clojure не массивы а деревья, откуда O(1) для conj взято, непонятно. вообще с time complexity не очень понятно.

fxposter19:03:01

@andmed: это как push-back для вектора - O(1) скорее всего

mike145219:03:01

я превожу определение функционального языка так

mike145219:03:19

1. Чистые функции: - результат зависит только от аргументов. - от одних и тех же аргументов - одни и те же результаты. - состояние программы явно задано только аргументами функций

fxposter19:03:19

ой, не буду я на этот счет спорить :simple_smile:

fxposter19:03:37

чистые функции можно писать на чем угодно, вплоть до процедурного языка

fxposter19:03:41

ну не надо

mike145219:03:44

2. Функции как объекты 1 класса: - функции можно сохранить как структуру данных - функции можно передавать как параметры - функции можно возвращать как результат - функции можно динамически создавать во время исполнения

fxposter19:03:47

на фортране можно

artemyarulin19:03:48

я на баше такое смогу написать)

mike145219:03:25

3. Функции высших порядков 4. Упор на реккурсию

fxposter19:03:27

в C можно референсить функции :smile:

mike145219:03:50

вот эти 4 свойства определяют функциональный язык. но это ИМХО

artemyarulin19:03:09

читал месяц назад наверно статейку (не могу счас найти) - what is the functional language или типа того. Дак там было сказано что функциональный язык этот тот на котором легко писать фунциональщину и который подталкивает тебя к этому. Именно поэтому мол JS - не Ф, а всякие кложуру и хаскели - да

mike145219:03:41

ну да, попробуй измени мутабельную переменную

mike145219:03:49

ой, иммутабельную

andmed19:03:17

@fxposter: те доки что я нахожу, говорят, что создается новое дерево, это же logN

mike145219:03:20

сам язык, так сказать подталкивает к функциональному кодау

mike145219:03:38

там всего 5 уровней. так что считайте O(1)

fxposter19:03:48

@andmed: это по идее O(depth(tree))

fxposter19:03:05

а так как дерево как правило неглубокое - то ~ O(1)

artemyarulin20:03:25

кстати раз уж тут про перформанс - я вроде помню патч в кложуру который автоматически генерил/использовал классы если в мапе 1-3 ключа всего (Tuple_1 или чота такое вспоминаю). Опять же есть defrecords которые создают классик на жаве и типо поднимают перформанс ибо обращение по филду быстрыее чем в мапе. Вопрос: Смысла нет получается делать defrecords с 2-3 полями?

artemyarulin20:03:46

сорян если как всегда все переврал и вообще глупость написал, "тока учусь”(с)

fxposter20:03:51

если я не ошибаюсь - это убрали

fxposter20:03:02

есть просто Tuple

fxposter20:03:31

> Вопрос: Смысла нет получается делать defrecords с 2-3 полями? не очень понятно, как ты пришел к такому выводу

fxposter20:03:06

вообще у тебя в абсолютном большинстве случаев не будет проблемой юзать везде map

artemyarulin20:03:16

дада, я именно так и делаю

artemyarulin20:03:53

просто пытаюсь понять зачем мне может понадобиться defrecord и нашел тока один пока аргумент как перформанс. Но если есть тупл - то тож самое же будет, не?

artemyarulin20:03:19

ну я пришел к выводу как: - Тупл есть, использьзует филды, значит так же быстр

fxposter20:03:19

а сколько ты на кложуре пишешь?)

artemyarulin20:03:32

месяца 2, я до этого год на CLJS

fxposter20:03:42

а на cljs сколько?)

fxposter20:03:48

defrecord - создание типа :simple_smile:

fxposter20:03:59

тип используется для чего?)

fxposter20:03:13

по типу можно диспатчить

artemyarulin20:03:24

так пажди, погуглю :smile:

fxposter20:03:52

гугли - ООП, полиморфизм, позднее связывание, динамический диспатч

fxposter20:03:19

это то, на основе чего диспатчатся методы в протоколах

mike145220:03:27

@artemyarulin: defrecord нужен если хочешь использовать полиморфизм

artemyarulin20:03:01

это не актуальная картинка уже?

fxposter20:03:06

@mike1452: только не говори это слово при академиках или людях, юзающих хаскель или что-то подобное, потому что они тебя не поймут

fxposter20:03:45

@artemyarulin: видел картинку. вроде норм.

fxposter20:03:50

там про протоколы есть :simple_smile:

artemyarulin20:03:17

просто вот на картинке стрелка к defrecord - бла бла бла be associated with performance-sensetive code

artemyarulin20:03:49

точнее чуть выше

fxposter20:03:45

там есть OR

fxposter20:03:22

потому что в том числе доставать поле по индексу дешевле чем из мапы доставать по ключу

artemyarulin20:03:28

дак а возвращаясь к вопросу про туплы - defrecord будет работать быстрее все равно да?

fxposter20:03:22

они могут работать быстрее. зависит от реализации. но думаю что да.

artemyarulin20:03:38

ок понятно, спасибо

jetmind20:03:48

@prepor: из коробки стрикт-мод не работает с вимовскими штуками, но похоже можно заставить через evil-smartparens. Спасибо, поиграюсь на досуге