2011-06-12 22 views
23

In Clojure si può scrivere:perché è: altrimenti no (altro) in clojure?

(cond (= 1 2) 1 
     :else 5) 

Nello Schema l'equivalente sarebbe:

(cond ((= 1 2) 1) 
     (else 5)) 

La sintassi :else 5 non è così coerente come il (else 5). Qual è la ragione per cui la sintassi else viene implementata in questo modo apparentemente incoerente in Clojure?

+0

Grazie per tutte le belle risposte. Hanno tutti aggiunto valore. – steenhulthin

risposta

26

Penso che (else 5) sia meno coerente. Gli argomenti (cond ...) sono indicati come coppie condizione-valore. :else value è coerente perché :else è solo una convenzione - funziona perché :else è solo un'espressione che è sempre vera. Non ci sono regole speciali per :else.

3

Ci sono molte ragioni; principalmente penso che sia perché cond è implementato come una macro intorno a if. D'altra parte, nello schema else è solo un sinonimo di t in questo contesto; non è una chiamata di funzione, quindi perché farlo apparire come uno?

+2

In che modo il fatto che 'cond' sia implementato come una macro rilevante? –

+0

Perché le macro hanno una sintassi diversa dalle funzioni. –

34

:else è un realtà un po 'di un trucco intelligente qui:

  • cond aspetta coppie condizione/valore - e: il resto è solo un valore che è "truthy" in Clojure modo garantisce che il condizione è soddisfatta. (qualsiasi cosa eccetto nullo o falso conta come "verità"). Puoi ugualmente usare ": donkey" come un valore garantito di condizione vera se ti è piaciuto.
  • Tuttavia,: altro anche trasmette significato ad un lettore umano (cioè questa condizione è quella che deve essere eseguito se nessuno della partita altre condizioni

Quindi, in realtà è solo una convenzione che lavora in cond espressioni ed è significativo per i lettori umani

3

99% delle volte, i parenti in Clojure implicano una funzione o una macro chiamata.Questo è in contrasto con altri Lisp che usano i parenti per il raggruppamento.In Clojure, se il raggruppamento è necessario, ad es. nelle associazioni fn o let, verrà utilizzato il numero [] d.

Rich discute parte del ragionamento dietro fare questo cambiamento in una recente intervista here. In breve, si contribuisce a rendere il codice più leggibile immediatamente, perché non c'è bisogno di spendere tempo per capire che cosa parentesi rappresentano.

+0

ma: è valido clojure; sta per gettare un'eccezione – naiad