2015-06-15 13 views
6

io sono un po 'chagrinned che alcune delle funzioni built-in Clojure avere quello che mi sembra essere un comportamento incoerente.Clojure:/modo pulito Idiomatic per evitare NPE in un modo simile a Monade

che sto cercando di fare questo:

(let [kwns (namespace (keyword v))] 
    ...) 

in un contesto in cui v potrebbe essere nil. La funzione keyword funziona come mi aspetto (rendimenti nil), ma spazio dei nomi getta una NPE.

Avevo l'impressione che le monadi non fossero usate spesso in Clojure poiché la punzonatura nilotica sembra essere la forma idiomatica (come this article continua a lungo).

mi aspettavo kwns uscire nullo, non genera un NPE. Quando questa incoerenza solleva la sua brutta testa, qual è il modo consigliato di mantenere il codice pulito .... infarcendo nil controlli nel mio codice è non la risposta che sto volendo, naturalmente.

risposta

10

Would some-> lavoro per voi?

user=> (doc some->) 
------------------------- 
clojure.core/some-> 
([expr & forms]) 
Macro 
    When expr is not nil, threads it into the first form (via ->), 
    and when that result is not nil, through the next etc 
nil 
user=> (some-> nil keyword namespace) 
nil 
user=> (some-> "user/a" keyword namespace) 
"user" 
+2

Perfetto ... Sapevo che doveva esserci qualcosa! –

Problemi correlati