Non riesco a pensare immediatamente a un modo sintetico e conciso per farlo.
L'opzione 1 è che non ce n'è uno, perché questa è una situazione un po 'strana. Se sai che ci dovrebbe essere esattamente un elemento, perché è in una lista in primo luogo?
opzione 2 è che ce n'è uno, e qualcuno arriverà e dirà off per non vederlo :)
Detto questo, nella vostra situazione avrei probabilmente scrivere qualcosa di simile:
(let [[item & rest] alist]
(if (nil? rest)
(throw (IllegalArgumentException. "Expected a single-element list"))
item))
Forse più semplicemente, si potrebbe anche solo fare (count alist)
e assicurarsi che avesse esattamente un elemento. Il codice sopra, tuttavia, ha la bella proprietà che non imporrà la valutazione oltre il capo della lista, ma a seconda del caso d'uso che potrebbe non essere una preoccupazione.
Sì. Questa risposta – dfreeman
'(only [1 nil])' illustra un bug in questa soluzione. –
@AlexBaranosky Cura di spiegare? '(next [1 nil])' is ''(nil)' e '(nil?' (nil))' è 'false'. Quindi, '(solo [1 nil])' genera un errore di asserzione come desiderato. –