Clojurians
#clojure-italy
<
2017-07-31
>

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

nilrecurring08:07:03

buon lunedì :slightly_smiling_face:

richiardiandrea08:07:02

oss del weekend, ho implementato un aggregatore di blob per unrepl che prende i file sorgente, li ordina in dependency order and li concatena cosi' che unrepl possa eval-uarli. In piu' finalmente ho risolto un bacozzo storico in boot-figreload

nilrecurring08:07:44

Ho avuto il piacere di seguire la cosa in diretta, joinate #unrepl se curiosi :smile:

bronsa08:07:31

un tl;dr su cos'e` unrepl?

bronsa08:07:55

e che relazione ha con nREPL/socket-repl

richiardiandrea08:07:59

@bronsa e' un'alternativa a nRepl, che viaggia su socket-repl, dove praticamente le varie "feature" sono mandate tramite blob (form edn) client side

richiardiandrea08:07:57

i vari blob si auto-`eval`-uano

richiardiandrea08:07:32

cosi' che le connessioni al REPL sono "indipendenti"

richiardiandrea08:07:08

(stiamo ancora decidendo cosa fare se due client mandano lo stesso namespace in realta')

richiardiandrea08:07:58

la stessa implementazione del protocollo unrepl e' mandata client-side

richiardiandrea08:07:07

o meglio questo: (slurp "src/unrepl/print.clj") (slurp "src/unrepl/repl.clj") "\n(unrepl.repl/start)")

bronsa08:07:18

interessante, sta sera ci do un'occhiata

richiardiandrea08:07:10

si, e' ancora agli albori mandare cose client-side e' una bella idea ma per esempio il primo eval e' (deve essere) blocking

richiardiandrea08:07:45

praticamente l'extension model non e' ancora stato definito, ma si vorrebbe evitare il middleware di nRepl

richiardiandrea08:07:14

c'e' stato un talk a EuroClojure ma i video non sono ancora usciti

reborg17:07:07

(def x (/ 1. 0))
(def v [(/ 0. 0) (/ x x) (* 0 x) (- x x) (Math/pow 1 x) (Math/sqrt -1)])
(frequencies v)
{NaN 1, NaN 1, NaN 1, NaN 1, NaN 1, NaN 1}
... clj-batman!

reborg19:07:38

sto pensando se ci sono altri modi di creare maps con chiavi duplicate

reborg19:07:11

che poi questo qui sopra e' transient in azione

bronsa19:07:49

nah, transient non c'entra

bronsa19:07:56

e` NaN che compara <> a se stesso

bronsa19:07:09

user=> {(identity Double/NaN) 1 (do Double/NaN) 2}
{NaN 1, NaN 2}

reborg19:07:58

mmh, pero' se non usi il trick di distinguirli a compile time il gioco non viene

reborg19:07:04

(ti sto dando ragione)

bronsa19:07:17

si` certo, a read time le chiavi devono essere diverse

reborg19:07:02

Ma transient permette questo:

user=> (def m (transient {}))
#'user/m
user=> (assoc! m Double/NaN 1)
user=> (assoc! m Double/NaN 1)
user=> (persistent! m)
{NaN 1, NaN 1}

bronsa19:07:33

dovrebbe funzionare anche con assoc normale

reborg19:07:51

non credo, ora provo

bronsa19:07:04

user=> (assoc (assoc {} Double/NaN 1) Double/NaN 2)
{NaN 1, NaN 2}

reborg19:07:47

ok, avevo confuso

bronsa19:07:23

se vuoi vederne una divertente,

user=> (let [a (array-map Double/NaN 1)] (assoc a (key (first a)) "foo"))
{NaN 1, NaN "foo"}
user=> (let [a (hash-map Double/NaN 1)] (assoc a (key (first a)) "foo"))
{NaN "foo"}

bronsa19:07:03

occhio a usare assoc! cosi`, comunque

reborg19:07:15

whoa, penso di non aver mai fatto caso a "key" senza la s

reborg20:07:21

ho guardato un po' l'impl dei due assoc. Non ho trovato la risposta in tempi brevi, mi arrendo!

reborg20:07:03

ah... forse qualcosa di simile a quello che succede con var deref nel seguente

(def x Double/NaN)
(frequencies [x x])
;; {NaN 2}
(frequencies [Double/NaN Double/NaN])
;; {NaN 1, NaN 1}

bronsa20:07:51

piu` o meno, quello e` perche` x x comparano identical?

bronsa20:07:05

mentre Double/NaN e Double/NaN no