Clojurians
#clojure-italy
<
2018-11-20
>

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

justalanm07:11:56

@andrea.crotti siamo bloccati alla 1.6 di Spark (non per volere nostro) quindi Python è un no-no. L'unico clojurista sono io, per lo più abbiamo dei javisti oltre ai data scienziati più puri che non vanno più in là di R o Python. Alla fine Scala non è così male, da quello che ho capito basta non farsi prendere dalla smania di assegnazione compulsiva :joy:

manuel08:11:45

mi vien voglia di tornarci :slightly_smiling_face:

justalanm09:11:12

Riservato, non sapevo fosse free! Ci vado sicuramente

reborg09:11:55

Io invece ho deciso di andare a Minsk. Ma cerchero’ di esserci anche a DCD19

andrea.imparato11:11:23

avete per caso idea perchè questo snippet mi da' errore?

andrea.imparato11:11:26

(let [message (generate-message)
      count-message (count message)]
  (message))

andrea.imparato11:11:41

sì può fare binding multiplo in clojure vero?

andrea.imparato11:11:09

l'errore che mi sputa fuori è Wrong number of args (0) passed to: PersistentVector

reborg11:11:21

si nessun prob con quello. Strano che qualcosa che puoi contare (message) lo puoi anche invocare… appunto

reborg11:11:59

(message) stai cercando di usare un vector come una funzione, che teoricamente e’ possibile se passi un parametro

andrea.imparato11:11:43

ah! è count che trasforma message in vector per caso?

reborg11:11:56

no no, message e’ un vector

reborg11:11:23

(generate-message) ritorna [...]

andrea.imparato11:11:51

hmm e come faccio a tornare message quindi?

reborg11:11:02

senza parentesi

andrea.imparato11:11:03

basta che gli tolgo le parentesi giusto?

andrea.imparato11:11:14

grazie mille @reborg :slightly_smiling_face:

reborg11:11:43

ma a quel punto puoi togliere count-message perche’ apparentemente non lo usi (a meno che non manchi del codice che non si vede)

andrea.imparato11:11:28

voglio fare un loop fino a quando count-message non è maggiore di 3 e quando lo è ritornare message :slightly_smiling_face:

reborg11:11:35

Mmmh, no, non riesci a prendere l’ultimo valore di message.

andrea.imparato11:11:11

è quello che voglio risolvere è parecchio non deterministico :smile:

mpenet11:11:07

reduce + reduced?

bronsa11:11:20

@andrea.imparato se hai ancora problemi con la sintassi (parentesi vs no) e cose basilari come "come loopare in clojure" io ti consiglio di studiarti le basi su qualche libro, altrimenti non andrai da nessuna parte a cercare di imparare clojure "a occhio"

reborg11:11:24

Vero, ma credo sempre in un buon 50-50% mix libro + side project dove inevitabilmente si sbattono i denti :slightly_smiling_face:

andrea.imparato11:11:31

@bronsa ho letto parecchio nell'ultimo periodo, sto facendo pratica adesso un po' a caso sì ma è quello che voglio fare :slightly_smiling_face:

reborg12:11:51

La soluzione loop e’ quella piu’ vicina allo stile imperativo:

(defn generate-message [] (vec (drop (rand-int 10) (range 10))))
(loop [msg (generate-message)] (if (> (count msg) 3) msg (do (println "not taking" msg) (recur (generate-message)))))
;; not taking [7 8 9]
;; not taking [7 8 9]
;; [5 6 7 8 9]
C’e’ anche l’opzione di usare lazy sequences. (repeatedly generate-message) crea una lista infinita di messaggi, ovviamente consuma solo fino ad un certo punto. Aparte lo stile, tra le due opzioni il loop e’ piu’ veloce. (first (drop-while #(>= 3 (count %)) (repeatedly generate-message)))

mpenet12:11:47

non mi piace in realta ma e possibile: (reduce #(when (> (count %2) 3) (reduced %2)) (repeatedly generate-message))

reborg12:11:40

mi piace anche quella :slightly_smiling_face:

mpenet12:11:17

(let [return reduced for-each reduce] (for-each #(when (> (count %2) 3) (return %2)) (repeatedly generate-message))) :smile:

reborg12:11:02

La prima reduce non e’ male secondo me. Non e’ che forza la sintassi o che, solo richiede si apere come funziona reduce (che alla fine e’ un loop). Metto nel libro :slightly_smiling_face:

reborg12:11:37

(con attribution)

mpenet12:11:34

si puo gia pre-order? :slightly_smiling_face:

reborg12:11:02

mancheranno 50/60 pagine

mpenet12:11:22

hai un link?

mpenet12:11:08

in english sorry: reduce is arguably actually much better (for eager stuff) since it doesn't force you to know if/when it will hit ireduceinit/coll-reduce, if it can it will go fast, with loop you might have to juggle a bit to hit the right path on the input coll

reborg12:11:30

Not sure I understand the last bit, what do I need to juggle in the loop above? I see the advantage compared to sequential stuff tho, but reduce drives a loop behind.

mpenet12:11:39

reduce is not just a loop, it will call clj code that is optimised in some cases

mpenet12:11:47

ex for stuff that can be reduced over (ex stuff produced by (range ...) (cycle ...) eduction and whatnot)

mpenet12:11:50

with loop you might create seqs at each iteration depending on what you loop over

mpenet12:11:04

ex via (rest coll) or (next coll)

reborg12:11:06

Oh sure, I see what you mean

mpenet12:11:28

more obvious with (range foo) as input

reborg12:11:31

good point

mpenet13:11:55

it's possible to get to quite same byte-code probably via loop, but that would require quite a lot of know-how of the internals of the colls and it's way more advanced in these cases

andrea.imparato13:11:33

grazie a tutti! è per questo che amo questa community :slightly_smiling_face:

justalanm13:11:27

Faccio una domanda anche io: in questo caso fare un channel bufferizzato e recuperare in modo non bloccante solo quando si riempe potrebbe essere un'altra soluzione? (ovviamente dipende molto da quello che uno deve farci)

bronsa13:11:39

e` un overenginnering mostruoso rispetto a quello che doveva fare @andrea.imparato

mpenet13:11:50

in theoria (async/promise-chan (filter #(> (count %) 3))) ma e anche molto strano