Fork me on GitHub
#clojure-italy
<
2018-07-09
>
manuel06:07:12

buon lunedì, gente

reborg15:07:05

Ho questo problema ricorrente, cioe' una mappa le cui keys possono essere nil oppure empty strings, e vorrei una logica del tipo (or :a :b :c :d). Risolto per ora con la seguente. Qualche altra idea? Un nome migliore?

(require '[clojure.string :refer [blank?]])

(defn if-present [m & ks] (some #(cond-> % (blank? %) seq) ((apply juxt ks) m)))

(if-present {:a "" :b nil :d "yes"} :a :b :c :d)
;; "yes"

gabriele16:07:08

(defn if-present
  [m & ks]
  (reduce (fn [acc k]
            (let [v (get m k)]
              (if-not (clojure.string/blank? v) (reduced v) acc))) nil ks))
@reborg io la preferisco così, la combo some, cond->, apply e juxt mi manda ammale

bronsa16:07:21

user=> (some (comp not-empty {:a "" :b nil :d "yes"}) [:a :b :c :d])
"yes"

reborg16:07:08

grazie entrambe... sapevo che c'era qualcosa di piu' semplice in giro... e che non lo vedevo!

reborg16:07:00

il not-empty e' la chiave in questo caso... cercavo proprio il (seq s) che non cambia la stringa se non e' nil or empty. Ed e' proprio non-empty

bronsa16:07:14

usato troppo poco spesso :)

gabriele16:07:47

a me fa un po' strano usare comp per combinare una funzione con una mappa per sfruttarne il fatto che la puoi trattare come una funzione

gabriele16:07:00

magari è idiomatico non so ma preferisco evitare di solito

bronsa16:07:15

e` idiomatico

bronsa16:07:27

non e` che puoi “trattare una mappa come una funzione”

bronsa16:07:33

una mappa E` una funzione

bronsa16:07:36

a tutti gli effetti

gabriele16:07:32

non la definisco con defn o fn quindi non è una funzione a livello di linguaggio, per lo meno una funzione che vedi normalmente

reborg16:07:02

non e' molto diverso da (some #{:a :b :c} [1 2 :a 3 4]) @gabriele.carrettoni, che si vede abbastanza in giro

gabriele16:07:56

si certo e anche quello non mi fa impazzire 😅 ma vabbe, son problemi miei

reborg16:07:28

A me in generale non fanno impazzire i conditional statements, meno ne vedo meglio sto 🙂