En una forma let
(Clojure aquí) que puedo hacer algo como¿Por qué no hay destrucción en forma de def?
(let [[u s v] (svd A)]
(do-something-with u v))
donde svd
devuelve una lista de longitud tres. Este es un tipo muy natural de que hay que hacer, ¿por qué no es que no tenemos
(def [u s v] (svd A))
y sus diversas generalizaciones como el comportamiento por defecto de la forma def
? No veo cómo esto podría interferir con algo que def
ya está haciendo. ¿Puede alguien que entiende el Zen of Lisp o Clojure explicar por qué def
no admite el enlace (con desestructuración) tan poderoso como let
?
Creo que este es el tipo de respuesta que me interesaba. A riesgo de editorialización excesiva de mi parte, supongo que estás diciendo que la razón por la que esto no se hace en Clojure es en parte técnica (en esa 'def' resulta ser una compilador primitivo), y en parte por convención (en ese caso (por ejemplo, Rich Hickey) podría haber comenzado con un primitivo 'def' * y declarado' def' más tarde en algún punto del núcleo). –
@GabrielMitchell sí, eso hubiera sido posible. Pero es mucho menos útil para 'def' que para 'let', y carecería de simetría. 'let' ** always ** toma un vector y las destrucciones dentro de eso; hacer que 'def' lo haga sería mucho menos conveniente, y hacer que def acepte un símbolo o una forma de desestructuración es bastante horrible. – amalloy
¿Puedes decir algo más sobre por qué un macro sería tan bruto? En este momento, estoy pensando que es una gran idea, pero, en base a su comentario, también me pregunto si de alguna manera iría en contra de Clojure. Por lo general, es mejor ir con el grano del lenguaje que armar algo que vaya en contra de él, pero parece atractivo para alguien sin experiencia en el idioma. El hecho de que después de 10 años, el uso de ese macro no sea un lugar común, me hace preguntarme si es una solución torpe a un problema que se resuelva de otra manera. –