clojure-italy

Andrea Imparato 2021-10-12T16:59:36.026800Z

buonasera a tutti! qualcuno puo’ illuminarmi riguardo agli argomenti delle funzioni? Quali sono gli use case tra passare gli argomenti “normalmente”, senza destructuring diciamo vs passare tutto in una mappa? Ed inoltre, c’e’ un modo di fare destructoring per una funzione tipo (f :a true) e prendere il valore di :a ma senza renderlo opzionale?

Andrea Imparato 2021-10-15T07:05:30.034600Z

Che funzionano a runtime ovvio però se ho test su quelle funzioni io sono già contento

helios 2021-10-15T15:01:46.034800Z

@imparato.andrea generalmente faccio come te, positional arguments fino a che sono pochi (3-4) e poi una mappa

reborg 2021-10-14T14:18:28.027800Z

eh eh ci sarebbe da scrivere parecchio perche' non c'e' una regola unica.

reborg 2021-10-14T14:20:46.028Z

Ti direi di stare attento ad usare mappe dapperttutto. Diventa facile perdere di vista cosa sta passando nella mappa che non e' di pertinenza della funzione corrente, e quindi rompere qualcosa di distante downstream che aveva bisogno di una certa chiave nella mappa.

👍🏻 1
reborg 2021-10-14T14:21:45.028200Z

In generale, direi di essere espliciti con gli argomenti finche' non ci sia una ragione per operare in altra maniera.

Andrea Imparato 2021-10-14T14:23:21.028400Z

potrebbe essere una buona regola, se ci sono piu’ di 3 argomenti, considera se usare una mappa? quello che non mi piace e’ vedere una call ad una funzione ed usare l’ordine degli argomenti per vedere dove sono mappati

Andrea Imparato 2021-10-14T14:23:28.028600Z

non so se mi sono spiegato bene 😄

reborg 2021-10-14T14:27:34.028800Z

Quindi cosa c'e' che non va qui sotto?

(defn myfn [a-num a-string a-vector])
(myfn 1 "a" [1 2])

Andrea Imparato 2021-10-14T15:13:30.029Z

qua niente pero’ qui si secondo me, c’e’ qualcosa che non va (defn [a b c d e f g])

Andrea Imparato 2021-10-14T15:14:39.029400Z

anzi ti dico, a-num a-string a-vector sono anche nomi che mi fanno riconoscere cosa le cose sono guardando il tipo del parametro che sto passando

Andrea Imparato 2021-10-14T15:15:20.029600Z

se non c’e’ il tipo, devo andare sulla call della funzione, emacs mi dice la sua definizione e poi devo mappare mentalmente i parametri

Andrea Imparato 2021-10-14T15:15:50.029800Z

se invece ho: (f {:a "a" :b "b" :c "c"})

Andrea Imparato 2021-10-14T15:15:59.030Z

so gia’ nome del parametro e suo valore

Andrea Imparato 2021-10-14T15:16:21.030200Z

cmq si concordo con te ovviamente che usare mappe DAPPERTUTTO non e’ buona cosa

Andrea Imparato 2021-10-14T15:16:35.030400Z

perche’ poi ti perdi e non sai piu’ cosa contengono

mdallastella 2021-10-14T19:39:52.032100Z

Un altro problema nell'uso delle mappe è la mancanza di controllo della presenza di un parametro a compile time. Se ho (defn f [a b c] ...) e chiamo (f 1 2) se ne accorge subito...

Andrea Imparato 2021-10-14T20:19:42.033400Z

Giusto, posso sempre usare pre conditions e controllare la presenza delle chiavi però no?

Andrea Imparato 2021-10-12T17:00:27.027600Z

io ultimamente mi trovo a passare tutto via mappa gigante perche’ mi trovo bene ma non so quale sia la best practice in generale 🙂