In una forma let
(Clojure qui) Posso fare qualcosa di similePerché non distruggersi in una forma def?
(let [[u s v] (svd A)]
(do-something-with u v))
dove svd
restituisce una lista di lunghezza tre. Si tratta di una specie molto naturale della cosa da fare, quindi perché non è che noi non abbiamo
(def [u s v] (svd A))
e le sue varie generalizzazioni come il comportamento predefinito del modulo def
? Non vedo come questo potrebbe interferire con qualsiasi cosa che lo def
stia già facendo. Può qualcuno che capisce lo Zen di Lisp o Clojure spiegare perché def
non supporta il binding (con destrutturazione) potente come let
?
Penso che questo sia il tipo di risposta a cui ero interessato. A rischio di eccessiva editorializzazione da parte mia, suppongo tu stia dicendo che la ragione per cui questo non viene fatto in Clojure è in parte tecnica (in quanto "def" capita di essere un compilatore primitivo), e in parte per convenzione (in questo caso (ad esempio Rich Hickey) avrebbe potuto iniziare con un 'primitivo' def' * e dichiarato 'def' più tardi in un punto del core). –
@GabrielMitchell sì, sarebbe stato possibile. Ma è molto meno utile per 'def' che per' let', e mancherebbe di simmetria. 'let' ** always ** prende un vettore e destructures all'interno di quello; far sì che 'def' fare lo renderebbe molto meno conveniente, e far sì che la def accettare o un simbolo o una forma destrutturante sia piuttosto terribile IMO. – amalloy
Puoi dire un po 'di più sul perché una tale macro sarebbe grossolana? In questo momento, sto pensando che sia una grande idea, ma, basandomi sul tuo commento, mi chiedo anche se sarebbe in qualche modo in grado di funzionare contro il grano di Clojure. Di solito è meglio andare con la grana della lingua piuttosto che montare qualcosa che va contro di essa ma sembra attraente per qualcuno che non ha esperienza con la lingua. Il fatto che dopo 10 anni, l'uso di una tale macro non sia di uso comune, mi fa pensare se sia una soluzione goffa a un problema risolto in un altro modo. –