Quando uno è migliore dell'altro? Uno è più veloce dell'altro o l'unica differenza è il ritorno di false o nil?Quando usare "se" e "quando" in Clojure?
risposta
Utilizzare if
quando si dispone esattamente di un caso attendibile e uno falso e non è necessario un blocco implicito do
. Al contrario, è necessario utilizzare when
quando si deve gestire solo il caso attendibile e l'implicito do
. Non c'è differenza di velocità, si tratta di usare lo stile più idiomatico.
(if (my-predicate? my-data)
(do-something my-data)
(do-something-else my-data))
(when (my-predicate? my-data)
(do-something my-data)
(do-something-additionally my-data))
Nel caso if
, verrà attivato solo se do-something
my-predicate?
restituisce un risultato truthy, mentre nel caso when
, vengono eseguiti sia do-something
e do-something-additionally
.
Utilizzare if
quando si hanno due espressioni diverse: per la clausola true
e per la clausola false
.
when
e when-not
sono utili in due casi:
- quando si desidera eseguire uno o più (implicita
do
aiuta qui) operazioni non puri condizionale; - quando si desidera valutare qualcosa quando alcuni predicati restituiscono
true
(ofalse
in caso diwhen-not
) e restituiscononil
in caso contrario.
unica differenza è il ritorno di falso o nullo
Non v'è alcuna differenza principale fra false
e nil
, come sia evaluate per false
nel contesto logico.
Ho notato una differenza stilistica nell'uso di 'when' in Clojure e Common Lisp. In CL, alcune persone considerano male usare 'when' se ci si preoccupa del valore restituito quando il test fallisce; in tal caso dovresti restituire esplicitamente 'nil' nell'ultima clausola di un' if'. È logico che sia comune usare 'when' in Clojure nella stessa situazione, poiché la maggior parte del codice è puramente funzionale in Clojure: i valori di ritorno sono raramente ignorati. Se i programmatori Clojure seguivano la convenzione CL, 'when' veniva usato raramente in un codice puramente funzionale. (Occasionalmente 'nil' contro' false' importa.) – Mars
@Mars, è interessante, esiste una vera ragione per la coesistenza di 'false' e' nil' in Clojure? Non riesco a pensare a nessuna situazione in cui 'false' potrebbe fare qualcosa che' nil' non potrebbe fare. – Mark
Penso che l'idea generale sia: "nil" significa "non c'è più niente nella sequenza", mentre "false" significa semplicemente falso. Il fatto che 'nil' significhi anche false permette di testare semplicemente la fine di una sequenza. Inoltre, puoi fare cose come '(ottieni {: a 1: b nil}: c false)'. Altre discussioni [qui] (http://stackoverflow.com/questions/5830571/why-did-father-of-clojure-say-that-schemes-true-false-are-broken), [qui] (http://stackoverflow.com/questions/6045404/why-clojure-idiom-prefer-to-return-nil-instead-of-empty-list-like-scheme), [qui] (http://www.lispcast.com/ nil-punning), e [qui] (http://clojure.org/lazy). – Mars
Cosa succede se devo solo gestire il caso vero e non è necessario alcun 'do' implicito, che è più convenzionale da usare in questo caso? – damonh
Usa 'quando'. La parte 'do' è un'ulteriore buona ragione per preferire' when' su 'if', non una precondizione necessaria. – schaueho