W let
postaci (Clojure tutaj) mogę robić coś jakDlaczego nie ma destructingu w formie def?
(let [[u s v] (svd A)]
(do-something-with u v))
gdzie svd
Zwraca listę długości trzy. Jest to bardzo naturalny porządek rzeczy do zrobienia, więc dlaczego nie jest to, że my nie mamy
(def [u s v] (svd A))
i jej różnych uogólnień jak domyślne zachowanie formularza def
? Nie widzę, jak mogłoby to kolidować z tym, co już robi def
. Czy ktoś, kto rozumie Zen of Lisp lub Clojure, wyjaśnia dlaczego def
nie obsługuje wiązania (z destrukturyzacją) tak potężnego jak let
?
myślę, że to jest to rodzaj odpowiedzi byłem zainteresowany. Na ryzyko nadmiernego editorialization z mojej strony, myślę, że mówisz, że powodem nie jest to zrobione w Clojure jest częściowo techniczny (w 'def' że dzieje się kompilator prymitywny), a częściowo przez konwencji (w tym jeden (np Rich Hickey) mógł rozpocząć z prymitywnym 'def' * i uznanej' def' później w pewnym momencie w rdzeniu). –
@GabrielMitchell tak, to byłoby możliwe. Ale jest o wiele mniej użyteczne dla 'def' niż dla' let' i nie ma symetrii. 'let' ** always ** pobiera wektor i destruktury wewnątrz; wykonanie "def" czyni to znacznie mniej wygodnym, a sprawienie, by def przyjmowało albo symbol, albo formę destruktywną, jest dość okropnym IMO. – amalloy
Czy możesz powiedzieć coś więcej o tym, dlaczego takie makro byłoby obrzydliwe? W tej chwili myślę, że to świetny pomysł, ale na podstawie twojego komentarza zastanawiam się, czy w jakiś sposób będzie to działało wbrew Clojure. Zwykle lepiej iść w zgodzie z językiem niż coś, co działa przeciwko niemu, ale wydaje się atrakcyjne dla kogoś niedoświadczonego w tym języku. Fakt, że po 10 latach korzystanie z takiego makra nie jest jeszcze powszechne, sprawia, że zastanawiam się, czy jest to niezręczne rozwiązanie problemu najlepiej rozwiązanego w inny sposób. –