Fork me on GitHub
#clojure-italy
<
2017-07-14
>
reborg08:07:34

guten tag!

bronsa13:07:34

si`, interessante

bronsa13:07:27

spero` verra` proposta una soluzione ufficiale prima della prima stable release

bronsa13:07:34

(da parte di spec o clojure.core intendo)

reborg13:07:19

puoi postare esempio di cosa risolve value-in?

bronsa13:07:11

usando s/keys, non c'e` la possibilita` di avere non-conforming keys

bronsa13:07:20

visto che non definisce alcun constraint sui tipi delle chiavi

bronsa13:07:40

usando s/map-of, dichiari constraint sui tipi delle chiavi, quindi puo` essere che una chiave sia non-conforming

bronsa13:07:54

la differenza pratica e` che se hai:

bronsa13:07:25

(s/def ::foo int?) 
(s/def ::bar (s/keys :req [::foo]))

bronsa13:07:54

e conformi {::foo "bar"}, il path sara` [::foo]

bronsa13:07:12

mentre se hai per esempio

(d/def ::bar (s/map-of keyword? int?))

bronsa13:07:28

e conformi {::foo "bar"} il path sara` [::foo 1]

bronsa13:07:46

visto che deve disambiguare tra la chiave e il valore (trattando le mappe come una sequenza di map entries, 0 e` la chiave e 1 e` il valore)

bronsa13:07:20

la conseguenza e` che i path di spec non sono compatibili con get-in

reborg14:07:28

oh, capito, grazie, quindi puo' fare (value-in m [::foo 1]) anche se 1 non e' una chiave...

bronsa14:07:40

non proprio, m in questo caso e` una struttura dati trasformata

bronsa14:07:24

al momento devi avere a disposizione sia la struttura dati che la spec per sapere a cosa si ci si sta riferendo

bronsa14:07:01

in {::foo {1 :val}} per esempio, a seconda di che spec stai conformando [::foo 1] puo` puntare a :val come a {1 :val}

bronsa14:07:03

la soluzione piu` pratica che mi viene in mente sarebbe un (defn val-in [map key spec not-found?] ..) in clojure.core