Fork me on GitHub
#clojure-italy
<
2018-02-20
>
reborg08:02:57

waffle morghen

reborg09:02:48

mmmhh... non mi ci far pensare

reborg09:02:03

(colpa mia)

reborg17:02:42

ma perche' tree-seq ripete tra i risultati anche le branch? Cioe', qual e' lo use case?

bronsa17:02:24

perche` e` misnamed

bronsa17:02:28

dovrebbe essere trie-seq

bronsa17:02:50

o meglio, nemmeno quello

bronsa17:02:38

esattamente il contrario di quel che ho detto invece

bronsa17:02:35

diciamo che tree-seq ritorna tutti i nodi, non i leaf node

bronsa17:02:58

proprio perche` a seconda di che tree stai considerando, non e` detto che i valori siano solo sui leaf node

bronsa17:02:09

prendi per esempio un tree come l’AST format di tools.analyzer

bronsa17:02:25

{:op :if :test {..} :else {..}}

bronsa17:02:51

questo node e` si` un branch, ma e` anche un node interessante

reborg17:02:40

mmmh, immagino ci sia qualche use case dove mi interessa sapere quale branch ha determinato il nodo che segue o roba del genere

bronsa17:02:04

no no, il punto e` proprio che i branch sono nodi loro stessi, che spesso contengono data allo stesso modo dei leaf node

reborg17:02:56

si quindi uso branch? e children per ottenere i dati che mi servono

reborg17:02:59

per come l'ho usato io tree-seq fin'ora alla fine filtro sempre quello che mi serve (cioe' no branch)

bronsa17:02:41

eh ma proprio perche` i tipi di alberi su cui stai operando sono un particolare tipo di albero

bronsa17:02:55

ma su un albero generico non puoi fare quell’assunzione

bronsa17:02:35

{:op :if :test {:op :val :val true} :then {:op :val :val 1} :else {:op :val :val 2}}

bronsa17:02:40

prendi questo albero in considerazione

bronsa17:02:49

se tree-walk fosse implementato come dici tu

bronsa17:02:31

mi ritornerebbe ({:op :val :val true} {:op :val :val 1} {:op :val :val 2})

bronsa17:02:05

perderebebe tutti i nodi che non siano leaf

bronsa17:02:38

nel caso di questo albero, {:op :if :test .. :then .. :else ..} e` interessante nello stesso modo che {:op :val ..} lo e`

reborg17:02:40

ok penso di aver capito

mdallastella18:02:48

Avrebbero potuto chiamarlo walk allora

reborg18:02:18

Qual e' il memory footprint della sequence prodotta da tree-seq? Sarebbe O(n) ma contiene anche ogni branch (che contiene le sub-branch e cosi' via). Mi sembra O(c^n) con c=depth ?

bronsa19:02:59

sempre O(n)

bronsa19:02:01

structural sharing

bronsa19:02:58

ma in realta` dipende da children

bronsa19:02:16

se ti passo (range) come children fn...

reborg20:02:07

vero... meglio non usarlo con mutable allora 🙂

reborg18:02:04

@mdallastella come clojure.walk/walk?

mdallastella19:02:58

Presumo ragionino in maniera diversa, @reborg

mdallastella19:02:42

Rimango sempre stupito da quante funzioni ci sono per le strutture dati, tante volte uso accrocchi quando ci sarebbero funzioni preposte...