otherwise - ¿Por qué es: else no(else) en clojure?
else clojure (4)
Creo que (else 5)
es menos consistente. (cond ...)
argumentos se expresan como pares de condición - valor. :else value
es consistente porque :else
es solo una convención, funciona porque :else
es solo una expresión que siempre es verdadera. No hay reglas especiales para :else
.
En Clojure puedes escribir:
(cond (= 1 2) 1
:else 5)
En Esquema el equivalente sería:
(cond ((= 1 2) 1)
(else 5))
La sintaxis :else 5
no es tan consistente como la (else 5)
. ¿Cuál es la razón por la que la sintaxis de otro tipo se implementa de esta manera aparentemente inconsistente en Clojure?
El 99% de las veces, los parámetros en Clojure implican una función o una macro llamada. Esto está en contraste con algunos otros Lisps que usan parens para agrupar. En Clojure, si es necesario agrupar, por ejemplo, en fn
o let
enlaces, usará []
lugar.
Rich analiza parte del razonamiento detrás de hacer este cambio en una entrevista reciente here . En resumen, ayuda a hacer que el código sea más legible de inmediato, ya que no tiene que perder tiempo para averiguar qué representan los parens.
Hay muchas razones; Principalmente creo que es porque cond
se implementa como una macro alrededor de if
. Por otro lado, en Scheme else
es solo un sinónimo de t
en este contexto; no es una llamada de función, entonces ¿por qué hacer que se vea como una?
:else
es un truco realmente inteligente aquí:
-
cond
espera pares de condición / valor - y: else es solo un valor que es "verdadero" en Clojure, por lo que garantiza que se cumpla la condición. (Cualquier cosa excepto nula o falsa cuenta como "verdad"). También puede utilizar ": burro" como un valor de condición verdadero garantizado si lo desea. - Sin embargo, else también transmite significado a un lector humano (es decir, esta condición es la que debe ejecutarse si ninguna de las otras condiciones coincide)
Así que realmente es solo una convención que funciona en expresiones de cond
y es significativa para los lectores humanos.