Fork me on GitHub
#clojure-italy
<
2019-07-15
>
Andrea Imparato09:07:21

buongiorno a tutti! domanda stupidissima, come faccio in una funzione avere un if che stampa qualcosa e che ritorna anche un valore? Perchè se uso do mi ritorna nil 😕

Andrea Imparato09:07:13

esempio:

(defn f []
  (if true
   (do
     (println "yeah)
    1)
   (do
    (println "NOoooo")
    2)))
`

Andrea Imparato09:07:24

hmm, indentato da cani lol

mdallastella09:07:05

Giorno! A me funziona

manuel09:07:40

non manca " dopo "yeah?

mdallastella09:07:56

(defn a [] (if true 
                   (do
                     (println "a")
                     1)
                   (do
                     (println "b")
                     2)))

(def x (a))   ;; x == 1

Andrea Imparato10:07:44

ah sì anche quello manca ovvio 🙂

Andrea Imparato10:07:21

ok ho trovato, nella funzione orginale avevo una parentesi sbagliata nell'if 🙂

👍 4
manuel10:07:02

con Emacs dovresti tranquillamente prevenire questo tipo di errori, by the way 😉

Andrea Imparato10:07:34

hmm con flycheck mi controlla solo la sintassi o sbaglio io qualcosa?

Andrea Imparato10:07:58

cioè l'espressione era valida era solo la parentesi che non "racchiudeva" l'espressione dopo

manuel10:07:45

ma perché mancava una parentesi da qualche parte (e questo è il caso dove Emacs aiuta), o perché la sintassi era sbagliata per altri motivi?

Andrea Imparato10:07:11

(defn f []
  (if true
    (do
      (println "yeah") 1))
  (do
    (println "nooo") 2))

manuel10:07:20

flycheck (+ opportuni linter) controlla la sintassi sì, ma non lo uso in Clojure quindi non so cosa controlla.

mpenet10:07:38

joker e ottimo

mpenet10:07:45

Con flycheck

Andrea Imparato10:07:50

vedi, l'if non racchiude il secondo do quindi f ritorna sempre la seconda espressione

Andrea Imparato10:07:07

@mpenet io uso spacemacs che usa joker per flycheck 🙂

manuel10:07:30

ma non manca la parentesi che chiude f?

Andrea Imparato10:07:14

anche... sorry copy paste amminchia

manuel10:07:45

l'if è concluso dopo la prima espressione, quindi l'if è valido, non è la sintassi sbagliata. No?

manuel10:07:33

~
❯ clj
Clojure 1.10.1
(defn f []
  (if true
    (do
      (println "yeah") 1))
  (do
    (println "nooo") 2))
#'user/f
user=> (f)
yeah
nooo
2

manuel10:07:36

non vedo nil, ecco.

Andrea Imparato10:07:50

sìsì mi ero sbagliato io

Andrea Imparato10:07:14

tranquillo 🙂. Dicevo che l'if non aveva il branch else tutto qua 🙂

Andrea Imparato10:07:28

devo ancora farmi bene l'occhio per le parentesi 🙂

manuel10:07:39

ah ok, capito. 🙂

andrea.crotti16:07:49

sto cercando di fare una migrazione da una libreria a un altra

andrea.crotti16:07:17

pero' siccome usano versioni di un altra libreria di base incompatibili, purtroppo e' un po' complicato anche se le API sono simili

andrea.crotti16:07:59

ho pensato di usare una cosa del genere

(defn jackdaw?
  []
  (try
    (require '[jackdaw.client])
    true
    (catch Exception _
      false)))
e poi fare tipo
(defn filter
  [& args]
  (if (jackdaw?)
    (do
      (require '[jackdaw.streams])
      (apply jackdaw.streams/filter args))
    (apply streams/filter args)))

andrea.crotti16:07:54

che non va quando jackdaw.streams non e' disponibile pero'. E cmq per completezza jackdaw l'ho aggiunto a un profilo diverso, aggiornando le librerie di base, che permette di lasciare tutto come sta di default

andrea.crotti16:07:59

mi sa che serve un po' di macro magic, perche' il body di quando non ho jackdaw non dovrebbe essere proprio la' quando non c'e' jackdaw

andrea.crotti16:07:25

anche il secondo tentativo con macro non va pero'

(defmacro if-jackdaw
  [jk-body old-body]
  `(try
     (require '[jackdaw.client])
     ~jk-body
     (catch Exception _
       ~old-body)))

andrea.crotti16:07:58

qualche idea di come fare questa magia?

andrea.crotti16:07:08

o altri modi per fare una cosa simile?

andrea.crotti16:07:14

ah ottimo non serve neanche la macro mi sa