Fork me on GitHub
#clojure-russia
<
2016-03-10
>
artemyarulin05:03:32

дорогой чатик, f1 и f2 я все понимаю, но почему f3 такая зараза? Почему дефолтные параметры не эффектят :as алиас? Это ж не логично, или это не бага а фича?

>(defn f1 [{:keys [a b] :or {a 1 b 2} :as opts}] [a b])
>(defn f2 [{:keys [a b] :or {:a 1 :b 2} :as opts}] [a b])
>(defn f3 [{:keys [a b] :or {:a 1 :b 2} :as opts}] opts)
>(f1 {}) 
[1 2]
>(f2 {}) 
[nil ni]
>(f3 {}) 
{}

andfadeev05:03:44

В ор нужно не кейворды же

andfadeev05:03:12

Но я с телефона и тока проснулся, могу тупить

artemyarulin05:03:02

ой, забыл пофиксить, еще раз последний пример без кейвордов:

>(defn f3 [{:keys [a b] :or {a 1 b 2} :as opts}] opts)
>(f3 {})
{}

artemyarulin05:03:23

т.е. :or аффекит все что в :keys, но в :as остаются тока оригинальные параметры

andfadeev05:03:12

Ну так там только оригинальные и должны быть

andfadeev05:03:24

Судя по доке кложуры

artemyarulin05:03:25

хм, т.е. не бага, а фича, ну ок

artemyarulin05:03:05

спасибо

andfadeev05:03:23

In addition, and optionally, an :as key in the binding form followed by a symbol will cause that symbol to be bound to the entire init-expr.

artemyarulin05:03:43

init-expr понял да, не внимательно читал видать

andmed10:03:58

Привет опять. Прошел koans, думаю за 4clojure взяться. Все нравится. А зашел вот на codeeval -- по последней статистике clojure единственный из попавших в двадцатку языков, который за последние три года подряд снижает популярность.. обидно и непонятно. http://blog.codeeval.com/codeevalblog/2016/2/2/most-popular-coding-languages-of-2016

andmed10:03:31

А есть ли почитать в сети скажем так, конструктивную критику языка?

andmed10:03:37

Тоже интересно

larhat10:03:46

@andmed: а вы посмотрели, как они данные собирали, среди кого?

andmed10:03:44

Ну ясно что не показатель. Это я так, "здравствуйте". simple_smile А вот критику языка от профи почитал бы с удовольствием

artemyarulin10:03:30

Хм, вроде есть понижение да. Хотя странно, я всего года полтора с Clojure(Script) и мне кажется чем дальше тем его больше

andmed10:03:57

у меня пока дискомфорт вызывают отдельные решения (вроде, семантического выбора векторов вместо листа, и разное поведение одной инструкции в зависимости от типа данных, вроде добавления в конец/в начало, при том что как я понимаю в основе деревья там и там) но списываю это на незнание деталей реализации. ок, это можно запомнить, не проблема. но я вообще не смог нагуглить сколь-нибудь объемного поста с обзором действительно недостатков язвка, так, отдельные дискуссии на google groups.

artemyarulin10:03:29

дак их нет 😄

artemyarulin10:03:46

скобочки осилил и можно жить. Не понравилось чо - написал макрос simple_smile

artemyarulin10:03:12

@andmed: Ты кста про Clojure или ClojureScript? Или оба?

andmed10:03:34

@artemyarulin: это и пугает, что их "нет"

artemyarulin10:03:58

скобочки simple_smile

artemyarulin10:03:12

Если серьезно - нету типов, мы тут холиварили на эту тему, мол плохо это или хорошо, хз Слишком другой - народ боится пробовать ЛИСП

potapenko10:03:40

Тенденция в мире чистого JS - многое перетягивать из кложуры и функциональных языков - имутабельность, чистые функции. Многие задумываются, как я, а чего не писать стразу на нормальном функциональном языке. Тенденция явно есть, народ очен кложурой интересуется. А если завелся один в какой тусовке кложурщик, так все, это заразная болезнь. Так что мне кажется тут перспективы для Clojure очень хорошие.

potapenko10:03:12

Останавливают скобочки, ага. Но потом их любят.

artemyarulin10:03:58

Мне нравиться больше что кложура запрыгнула на поезд с JS и теперь я могу радостно прогать и на мобайле с реакт нейтивом. Не согласен тока что “это заразная болезнь”, нефига его не просто протащить на работе(

larhat10:03:00

@artemyarulin: я думал у тебя на работе кложа, сопротивляются?

niquola10:03:07

@andmed прочитай programming clojure

niquola10:03:25

Жирный и хороший пост

niquola10:03:36

Пройди clojure-koans

niquola10:03:24

@artemyarulin типы есть, нет тайпчекер ;)

andmed10:03:39

@nicola: Ok. В копилку. koans осилил, в планах 4clojure

artemyarulin10:03:34

@larhat: Ну в прод я выпустил пару сервисов оно уже радует и посаппорчу их чутка, но “должен быть единый язык для всех беков и это будет го”. Не взлетело 😞

larhat10:03:52

отпиздить не вариант? %)

larhat10:03:03

ну в смысле, того кто го продвигает

larhat10:03:09

какие за го то плюсы?

artemyarulin10:03:57

CSP + типы. У нас с ноды чуваки уходят, после ада с коллбеками, промисами и ЖС - го это прям небеса

larhat10:03:10

csp в кложе лучше

artemyarulin10:03:59

Да я знаю, согласен. Но ГО на слуху, гугла все дела, кложуру знает полтора инвалида

andmed10:03:39

@nicola: Вчера весь вечер копался в общей литературе по функциональному программированию, более всего понравилось Introduction Bird'a, его и возьму. И типы Окасаки

larhat10:03:41

гугл кроме файлоотдатчика того, про который фицпатрик рассказывал, сделал что-нибудь? %)

artemyarulin10:03:55

Ну я дурак еще конечно - надо было продвигать, презенташки делать, про FP, immutable рассказывать, а у меня времени не было да и язык не из того места

larhat11:03:15

"типы окасаки" — @andmed — в смысле "purely functional data structures"?

andmed11:03:29

@larhat: так точно

larhat11:03:51

ещё вот эта хорошая — http://funprog-ru.github.io

larhat11:03:57

для введения

larhat11:03:20

"язык не из того места" — go то? :)

artemyarulin11:03:27

@andmed: Из всего по ФП самое лучшее что я читал это http://learnyouahaskell.com Реально, там совсем не сложно, но идею ФП можно отлично прочувстовать

artemyarulin11:03:47

@larhat: Нене, мой язык) Не умею рассказывать и убеждать

artemyarulin11:03:14

@andmed: Вот для меня еще было дофега полезным http://fsharpforfunandprofit.com, там просто кладезь информации

prepor11:03:19

> в конец/в начало, при том что как я понимаю в основе деревья там и там @andmed: нет ) Как это ни удивительно, но списки в кложе это списки ) Благо они сами по себе уже иммутабельная перзистентная структура данных.

artemyarulin11:03:00

@prepor: А вот кста - у тебя не бывает проблем что начинаешь с векторов, потом где-нить внутри поменял на лист и conj уже делает не то? (conj [1 2 3] 10) ;; [1 2 3 10] (conj (take 3 [1 2 3]) 10) ;; (10 1 2 3)

prepor11:03:51

у меня вроде не бывает, не припомню проблем )

artemyarulin11:03:55

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

oxgrouby12:03:07

ну дык списку дешевле в начало добавлять

oxgrouby12:03:12

вот в начало и добавляет

oxgrouby12:03:14

а вектору в конец

prepor12:03:27

мы понимаем simple_smile

malch13:03:17

Терминаторы побеждают

dottedmag13:03:38

Вчера же обсуждали.

artemyarulin13:03:03

нене, это уже вторая

dottedmag13:03:18

А, вторую. Точно.

artemyarulin13:03:43

а кто тут разбирается в го? Шансы были или AI рвет в клочья?

artemyarulin13:03:09

я читал кой-то анализ игры, ничо не понял вообще

malch13:03:40

тут хороший обзор

malch13:03:01

> Lee Sedol was full of praise for AlphaGo, remarking that, “Yesterday I was surprised, but today, more than that, I’m quite speechless.” > He added, “. . . there was not a moment in time where I felt that I was leading the game.”

dottedmag13:03:16

У Яна Бэнкса в "Player of Games" соревнования ограничены "baseline human and human-level AI", чтобы вообще интересно играть было :)

andmed13:03:08

@prepor: а чисто гипотетически: два разных оператора prepend и append скажем не повысили бы читаемость, и эту, как ее юзабилити?

andmed13:03:52

(два разных на два типа данных, с разным поведением)

prepor13:03:02

у тебя и так есть prepend (cons) и append (concat [a]). conj имеет свою семантику "вставь куда эффективнее" и, помимо использования как есть, используется еще и как базовый блок для into, например

prepor13:03:14

интерфейс prepend и append, например, не поддержать для мапов и сетов. а conj — пожалуйста.

dottedmag13:03:55

@prepor: cons всё-таки немного не то -- он возвращает не тот же контейнер, а seq.

savelichalex15:03:01

Кстати хороший вопрос. Я вот недавно for fun писал либу на js и сделал универсальные функции для eventstream, lazy sequence и нативных массивов. В итоге спросил в чатике по js, сказали что как то не айс иметь универсальные фукнции, непонятно из с чем работаешь в данный момент. А вы парни как считаете?

savelichalex15:03:23

в clojure то как раз больше за универсальные интерфейсы

dottedmag16:03:01

В языке для золотых рыбок отдельные функции полезны были бы.

savelichalex16:03:19

что простите?)

dottedmag16:03:43

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

savelichalex16:03:22

надо уточнить, что именно то полезно?

dottedmag16:03:02

Отдельные функции.

dottedmag16:03:22

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

savelichalex16:03:10

ну ок, я понял намек)

oxgrouby16:03:04

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

savelichalex16:03:06

@oxgrouby: а поподробнее

oxgrouby16:03:56

ну дык что подробнее -- это же основы, абстракция от конкретики, все дела. В тех же статически-типизированных джавах для этого дженерики, АДТ делают, а в динамике это из коробки, и вдруг -- "непонятно"

andmed16:03:32

при отдельных prepend/append кроме семантически понятного поведения, мы имеем (имели бы) неявный контроль типов (при неподходящем типе данных выбрасывается эксепшн).

oxgrouby16:03:54

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

bernik20:03:41

@andmed: в тему фп могу посоветовать https://drboolean.gitbooks.io/mostly-adequate-guide/content/index.html там все, начиная от чистых функций и каррирования, заканчивая монадками и функторами.

larhat20:03:07

жс, лямбда исчисления нету %)

larhat20:03:46

ещё и поди с this придётся бороться всякими

asolovyov20:03:37

на самом деле уже 4 страницы на cljs, но мне лень выдумывать, что об этом написать

asolovyov20:03:55

если знать, куда жать, то можно пару страниц без перезагрузки сменить )

larhat20:03:05

пререндер есть, да?

larhat20:03:12

ваще быстренько показало всё!

asolovyov20:03:36

тот самый, что я рассказывал

asolovyov20:03:21

на сервере не фетчит юзера и потом на клиенте дорисовывает немного

larhat20:03:58

а на мобилке те же картинки или поменьше/похуже?

larhat20:03:03

пушо там тоже всё быстро %)

asolovyov20:03:13

ты знаешь, те же )))

asolovyov20:03:29

у меня пока не хватило времени сесть и намутить запросы на картинки разных размеров )

asolovyov20:03:41

на тему "всё быстро" я недавно расстроился неслабо

asolovyov20:03:49

на iphone 4 (не 4s) жс даже не загружается ))

larhat20:03:00

ого, а чо это?

asolovyov20:03:29

та шось ему то ли памяти не хватает, то ли что

asolovyov20:03:55

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

asolovyov20:03:04

это не суперпросто, к сожалению

bernik20:03:40

@larhat: из книги > I must mention that, just like with Object-Oriented code, you must be aware of this coming to bite you in the jugular. If an underlying function uses this and we call it first class, we are subject to this leaky abstraction's wrath. > I avoid using this like a dirty nappy. There's really no need when writing functional code. However, when interfacing with other libraries, you'll have to acquiesce to the mad world around us. про лямбда исчисление, извини, не понял.

larhat20:03:54

ну нету ничего там про лямбда исчисление %( а про this — тупо использовать для обучения тухлый язык, кмк, с leaky abstractions

bernik20:03:16

а я подумал, что в js чего-то не хватает для лямбда исчислений 🙂

bernik20:03:14

по поводу тухлости js. подтекать абстракция начнет когда будут использовать тот самый this. пока не используешь ничего не течет а так автор просто сократил книгу на одну главу чтобы не объяснять синтаксис нетухлого языка

larhat20:03:02

ну это он исходит из того, что жс знают %)

bernik20:03:23

ну, я думаю это язык, который знает большинство