Fork me on GitHub
#clojure-italy
<
2019-08-15
>
helios07:08:21

buongiorno

helios07:08:27

buon ferragosto a chi lo dovesse fare šŸ˜›

helios07:08:41

e buon lavoro a chi no (me incluso šŸ˜„ )

andrea.crotti07:08:18

Hehe si buon lavoro anche a me

skuro07:08:05

ferrache?

skuro07:08:15

comunque buon giorno

Lu08:08:54

Ci rifaremo il 26 :)

Andrea Imparato09:08:35

buongiorno a tutti

Andrea Imparato09:08:18

mega domanda del giorno: quando usare pre-post e quando usare spec? E poi quando "speccare" le funzioni in generale? Io scriverei spec solo per funzioni che stanno ai confini del sistema, che dipendono cioĆØ da cose di cui non abbiamo il controllo. cosa dite?

Andrea Imparato09:08:37

pre-post per funzioni di cui non mi interessa fare instrumenting

andrea.crotti10:08:05

ai confini del sistema e' abbastanza la norma a quanto ne so

andrea.crotti10:08:55

pre/post mah dove vuoi, non sono tanti usati almeno dai noi

Lu11:08:00

Io mi sono imbattuto in persone che speccano tutto e chi non specca niente.. direi che un happy middle sarebbe speccare cio' che ha senso.. come nel tuo caso..

reborg11:08:08

Pre-post conditions sono utili per forzare semplici assunzioni su input/output di una funzione. Dico semplici percheā€™ eā€™ codice Clojure che viene assemblato a macro-expansion. Prendi ad esempio:

(defn save! [item]
  {:pre [(map? item)
         (string? (:name item))
         (#{:double :triple} (:width item))]
   :post [(= 10 (:id %))]}
  (assoc item :id 10))
Immagina se volessi riutilizzare la stessa precondizione in altri posti. Dovresti create una macro che espande passando ā€œitemā€ come parametro etc. Non piacevole. Spec invece eā€™ piuā€™ immediato per definire ā€œitemā€, vedere se valida e quando non valida sapere il percheā€™.

reborg11:08:49

Riguardo a quando usare spec, sono per la scuola del ā€œquando un oggetto entra nel sistema attraverso intefacce pubblicheā€ (quindi ai confini, concordo). Qualche volta lo vorrei anche usare per generative testing, ma in generale mi costringe a scrivere spec di parti del sistema che non sono ai margini, quindi alla fine non succede. Mi eā€™ anche utile per descrivere regole sintattiche di DSL varie ed ottenere un parser for free.

helios12:08:38

Grazie per aver scritto anche il mio pensiero šŸ˜„

reborg11:08:02

lā€™ultima volta che in team ho avuto qualcuno che voleva ā€œspeccareā€ tutto a prescindere, gli ho semplicemente detto che ha sbagliato linguaggio šŸ˜¬

šŸ”„ 8
Lu12:08:48

Sfortunatamente nel mio caso era il cliente ahah

šŸ™ˆ 4
4
šŸ’„ 4
andrea.crotti13:08:27

gli dovevi rispondere di "non speccare i maroni"

šŸ˜‚ 8
Andrea Imparato14:08:05

domanda sullo "stile", come vedete un flow per un'applicazione semplice (tic-tac-toe) che scrive solo su console dove c'ĆØ una sola mappa che rappresenta lo stato del gioco e questa mappa ĆØ passata a varie funzione le quali via destructuring si prendono le chiavi che gli interessano ed aggiornano lo stato del gioco mano a mano che il gioco va avanti? e poi, fare un loop infinito per fare giocare i giocatori ha senso farlo con un semplice (while (not (check-win state))) o ci sarebbe qualcosa di piĆ¹ idiomatico secondo voi?

Lu15:08:30

Se sono due computer a giocare puoi usare quell'approccio e mantenere tutto pure senza side effects.. ma per due umani hai bisogno di un on-click handler per ogni casella e' un atom da swappare ad ogni user input.. no?

Andrea Imparato15:08:34

I giocatori giocano in sequenza non in parallelo

Andrea Imparato15:08:55

E danno via console le coordinate delle caselle

Andrea Imparato15:08:36

Il side effect c'Ć© solo quando stampo il campo di gioco

andrea.crotti15:08:38

la classica cosa che si fa e' ritornare sempre nuove boards

andrea.crotti15:08:57

cosi eviti di mutare qualsiasi cosa

andrea.crotti15:08:21

in realta' non ti serve un atomo per niente, e la cosa bella di ritornare nuove boards e' che se vuoi (con una atomo in questo caso) puoi salvare tutta la storia

andrea.crotti15:08:27

e andare avanti e indietro

Lu15:08:34

Io personalmente userei loop recur e ritornerei ogni volta la nuova board

andrea.crotti15:08:10

e si la stessa cosa che dico io

āœ”ļø 4
Lu15:08:18

while era una soluzione pure valida ma serve un atom che in realta' non e' necessario

Andrea Imparato16:08:24

ok ok allora sembra che sono sulla strada giusta, per adesso ritorno sempre nuove boards, mi basta usare loop e dovrei esserci šŸ™‚

reborg16:08:52

confermo, implementato in passato completamente stateless

reborg20:08:58

(defn game-over? [board]
  (some
    #(apply = (map board %))
    [[0 1 2] [3 4 5] [6 7 8]
     [0 3 6] [1 4 7] [2 5 8]
     [0 4 8] [2 4 6]]))
(game-over? ["o" "x" "x" "x" "o" "o" "x" "x" "x"])
;; true

šŸ™‚ 4