This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2019-07-15
Channels
- # aleph (9)
- # announcements (6)
- # beginners (42)
- # calva (4)
- # cider (9)
- # clara (2)
- # clj-kondo (1)
- # cljdoc (108)
- # cljs-dev (10)
- # clojure (25)
- # clojure-brasil (1)
- # clojure-chicago (1)
- # clojure-europe (4)
- # clojure-italy (42)
- # clojure-nl (14)
- # clojure-uk (66)
- # clojurebridge (3)
- # clojurescript (23)
- # clojutre (2)
- # community-development (1)
- # cursive (2)
- # datomic (4)
- # figwheel-main (21)
- # fulcro (23)
- # jobs-discuss (1)
- # kaocha (1)
- # off-topic (10)
- # pedestal (4)
- # reitit (2)
- # shadow-cljs (41)
- # spacemacs (7)
- # sql (20)
- # xtdb (3)
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
😕
esempio:
(defn f []
(if true
(do
(println "yeah)
1)
(do
(println "NOoooo")
2)))
`hmm, indentato da cani lol
Giorno! A me funziona
(defn a [] (if true
(do
(println "a")
1)
(do
(println "b")
2)))
(def x (a)) ;; x == 1
ah sì anche quello manca ovvio 🙂
ok ho trovato, nella funzione orginale avevo una parentesi sbagliata nell'if 🙂
hmm con flycheck mi controlla solo la sintassi o sbaglio io qualcosa?
cioè l'espressione era valida era solo la parentesi che non "racchiudeva" l'espressione dopo
ma perché mancava una parentesi da qualche parte (e questo è il caso dove Emacs aiuta), o perché la sintassi era sbagliata per altri motivi?
(defn f []
(if true
(do
(println "yeah") 1))
(do
(println "nooo") 2))
flycheck (+ opportuni linter) controlla la sintassi sì, ma non lo uso in Clojure quindi non so cosa controlla.
vedi, l'if non racchiude il secondo do quindi f ritorna sempre la seconda espressione
@mpenet io uso spacemacs che usa joker per flycheck 🙂
anche... sorry copy paste amminchia
l'if è concluso dopo la prima espressione, quindi l'if è valido, non è la sintassi sbagliata. No?
esatto 🙂
~
❯ clj
Clojure 1.10.1
(defn f []
(if true
(do
(println "yeah") 1))
(do
(println "nooo") 2))
#'user/f
user=> (f)
yeah
nooo
2
sìsì mi ero sbagliato io
tranquillo 🙂. Dicevo che l'if non aveva il branch else
tutto qua 🙂
devo ancora farmi bene l'occhio per le parentesi 🙂
sto cercando di fare una migrazione da una libreria a un altra
pero' siccome usano versioni di un altra libreria di base incompatibili, purtroppo e' un po' complicato anche se le API sono simili
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)))
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
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
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)))
qualche idea di come fare questa magia?
o altri modi per fare una cosa simile?
ah ottimo non serve neanche la macro mi sa
grazie