This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2017-02-11
Channels
- # beginners (2)
- # boot (97)
- # cider (58)
- # cljs-dev (10)
- # cljsrn (7)
- # clojure (79)
- # clojure-austin (4)
- # clojure-brasil (1)
- # clojure-france (1)
- # clojure-russia (42)
- # clojure-spec (12)
- # clojure-uk (22)
- # clojurescript (150)
- # clr (1)
- # conf-proposals (7)
- # core-matrix (2)
- # cursive (4)
- # datomic (9)
- # jobs (2)
- # klipse (28)
- # leiningen (3)
- # lumo (8)
- # nrepl (1)
- # off-topic (28)
- # om (18)
- # om-next (2)
- # perun (17)
- # planck (9)
- # rdf (1)
- # re-frame (18)
- # reagent (7)
- # ring (2)
- # rum (1)
- # specter (11)
- # test-check (3)
- # untangled (1)
- # yada (7)
Нульпоинтер появляется, когда он хочет к к аккумулятору прибавить nil, я так это понял
Но comp должен применять функции (формы?) в порядке справа налево А т.к. первый пример работает, а второй нет, то почему-то comp работает как-то слева направо
:mindblown:
Спасибо
https://youtu.be/6mTbuzafcII?t=10m4s rich объясняет почему
Большое спасибо 🙂
Да. Теперь понятно, он хорошо объяснил
@rmuslimov арити-1 map-indexed и remove возвращают трансдюсеры (функции)
@kgofhedgehogs (defn bit-seq2int [s] (Long/parseLong (clojure.string/join (map {0 \0 1 \1} s)) 2)
@dottedmag: мне нужна совместимость с BigInteger
@kgofhedgehogs (defn bit-seq2int [s] (BigInteger. (clojure.string/join (map {0 \0 1 \1} s)) 2)
Мм. Децствительно. Но я сделал так, тк через quot и rem делал int2bit-seq
int2bit-seq с поддержкой BigInteger тоже можно было сделать через java interop?
Но тут немного хитрее, чтобы любое число можно было запихнуть, а не только BigInteger
джавовый.
Так что если уж делать совсем правильно, то сделать протокол IBitStringable
, который содержит один метод -to-bin-string
, и расширяет Integer
, Long
, BigInteger
и clojure.lang.BigInt
.
А через мультиметоды это можно сделать?
Просто я еще не знаю что такое протоколы в clojure
Можно, но не нужно. Здесь диспетчеризация по типу одного значения, для этого сделаны протоколы.
@kgofhedgehogs Это как интерфейсы в Java, но с той разницей, что реализацию интерфейса можно написать в любой момент и для любого типа.
@kgofhedgehogs Или, если знаешь Haskell, как typeclass в haskell.
Нет, знаю только питон и сишарп
Хорошо. Как интерфейс в C#, но с разницей, что можно взять и дописать реализацию любого интерфейса для любого типа в любой момент.
Т.е. вздумалось мне завтра выдувать пузыри разного цвета, в зависимости от того, какой объект мне засунули в функцию выдувания пузырей - я объявляю протокол IBubbleBlowable
, и реализую его хоть для java.lang.String
, хоть для nil
, хоть для своих типов, объявленных через deftype
.
Понятно. Т.е. протокол это типа интерфейса реализации функции для каких угодно типов. Если тип имеет расширение под IBubbleBlowable, то я могу вызвать для него функцию BlowBubble, верно?
Местами понятия не перепутал?
Почти. В протоколе есть набор функций. (defprotocol IBubbleBlowable (blow-this [x]) (blow-that [x y]))
Если для типа написана реализация IBubbleBlowable
, то такие значения можно передавать первым аргументом в функции blow-this
и blow-that
.
Да. Теперь всё понятно. А мультиметоды мне надо использовать не для реализации функции для разных типов, а реализаций метода для разных сущностей одного типа?
Мультиметоды можно использовать тогда, когда протоколы не работают - если диспетчеризация не по типу, а по чему-нибудь ещё, или если нужно диспетчеризовать больше, чем по одному аргументу.
Спасибо большое
А протоколы по соглашению именуются с буквы I или это для ассоциации с интерфейсами сделал?
Кто-то именует так, кто-то нет. Вот, например, внутренности ClojureScript: https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/core.cljs#L452