Fork me on GitHub
#clojure-russia
<
2017-02-11
>
rmuslimov00:02:16

comp принимает функции в качестве аргументов, у тебя формы

kgofhedgehogs00:02:05

Нульпоинтер появляется, когда он хочет к к аккумулятору прибавить nil, я так это понял

kgofhedgehogs00:02:45

Но comp должен применять функции (формы?) в порядке справа налево А т.к. первый пример работает, а второй нет, то почему-то comp работает как-то слева направо

dima00:02:21

в transducers comp работает слева-направо

kgofhedgehogs00:02:16

Спасибо

dima00:02:56

https://youtu.be/6mTbuzafcII?t=10m4s rich объясняет почему

kgofhedgehogs00:02:48

Большое спасибо 🙂

kgofhedgehogs00:02:56

Да. Теперь понятно, он хорошо объяснил

misha07:02:44

@rmuslimov арити-1 map-indexed и remove возвращают трансдюсеры (функции)

dottedmag10:02:30

@kgofhedgehogs (defn bit-seq2int [s] (Long/parseLong (clojure.string/join (map {0 \0 1 \1} s)) 2)

kgofhedgehogs11:02:56

@dottedmag: мне нужна совместимость с BigInteger

dottedmag11:02:54

@kgofhedgehogs (defn bit-seq2int [s] (BigInteger. (clojure.string/join (map {0 \0 1 \1} s)) 2)

dottedmag11:02:51

Явно быстрее, чем math/expt звать в цикле.

kgofhedgehogs11:02:42

Мм. Децствительно. Но я сделал так, тк через quot и rem делал int2bit-seq

kgofhedgehogs11:02:58

int2bit-seq с поддержкой BigInteger тоже можно было сделать через java interop?

dottedmag11:02:49

BigInteger.toString(int radix)

dottedmag11:02:58

Дальше split и map.

dottedmag11:02:26

Но тут немного хитрее, чтобы любое число можно было запихнуть, а не только BigInteger джавовый.

dottedmag11:02:01

Скажем, у Long метод называется toBinaryString.

dottedmag11:02:55

Так что если уж делать совсем правильно, то сделать протокол IBitStringable, который содержит один метод -to-bin-string, и расширяет Integer, Long, BigInteger и clojure.lang.BigInt.

dottedmag11:02:12

Тогда (def int2bit-seq [i] (into [] (map {\0 0 \1 1} (-to-bin-string i))))

kgofhedgehogs11:02:56

А через мультиметоды это можно сделать?

kgofhedgehogs11:02:16

Просто я еще не знаю что такое протоколы в clojure

dottedmag11:02:28

Можно, но не нужно. Здесь диспетчеризация по типу одного значения, для этого сделаны протоколы.

dottedmag11:02:55

@kgofhedgehogs Это как интерфейсы в Java, но с той разницей, что реализацию интерфейса можно написать в любой момент и для любого типа.

dottedmag11:02:04

@kgofhedgehogs Или, если знаешь Haskell, как typeclass в haskell.

kgofhedgehogs11:02:59

Нет, знаю только питон и сишарп

dottedmag11:02:32

Хорошо. Как интерфейс в C#, но с разницей, что можно взять и дописать реализацию любого интерфейса для любого типа в любой момент.

dottedmag11:02:09

Т.е. вздумалось мне завтра выдувать пузыри разного цвета, в зависимости от того, какой объект мне засунули в функцию выдувания пузырей - я объявляю протокол IBubbleBlowable, и реализую его хоть для java.lang.String, хоть для nil, хоть для своих типов, объявленных через deftype.

kgofhedgehogs11:02:54

Понятно. Т.е. протокол это типа интерфейса реализации функции для каких угодно типов. Если тип имеет расширение под IBubbleBlowable, то я могу вызвать для него функцию BlowBubble, верно?

kgofhedgehogs11:02:06

Местами понятия не перепутал?

dottedmag11:02:00

Почти. В протоколе есть набор функций. (defprotocol IBubbleBlowable (blow-this [x]) (blow-that [x y]))

dottedmag11:02:42

Если для типа написана реализация IBubbleBlowable, то такие значения можно передавать первым аргументом в функции blow-this и blow-that.

kgofhedgehogs11:02:50

Да. Теперь всё понятно. А мультиметоды мне надо использовать не для реализации функции для разных типов, а реализаций метода для разных сущностей одного типа?

dottedmag11:02:35

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

kgofhedgehogs11:02:21

Спасибо большое

kgofhedgehogs11:02:32

А протоколы по соглашению именуются с буквы I или это для ассоциации с интерфейсами сделал?

dottedmag11:02:52

Кто-то именует так, кто-то нет. Вот, например, внутренности ClojureScript: https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/core.cljs#L452