Trong một hình thức let
(Clojure đây) Tôi có thể làm một cái gì đó giống nhưTại sao không phá hủy ở dạng def?
(let [[u s v] (svd A)]
(do-something-with u v))
nơi svd
trả về một danh sách dài ba. Đây là một loại rất tự nhiên của việc cần làm, vậy tại sao không phải là chúng tôi không chúng tôi có
(def [u s v] (svd A))
và khái quát khác nhau của nó như là hành vi mặc định của mẫu def
? Tôi không thấy làm thế nào điều này sẽ can thiệp với bất cứ điều gì mà def
đã làm. Ai đó có thể hiểu được Zen của Lisp hoặc Clojure giải thích tại sao def
không hỗ trợ ràng buộc (với destructuring) mạnh mẽ như let
?
Tôi nghĩ rằng đây là loại câu trả lời mà tôi quan tâm. Nguy cơ biên tập quá mức về phía tôi, tôi đoán bạn đang nói rằng lý do không được thực hiện trong Clojure là một phần kỹ thuật (trong đó 'def' là một nguyên thủy của trình biên dịch), và một phần theo quy ước (trong đó một (ví dụ: Rich Hickey) có thể đã bắt đầu với một 'def' nguyên thủy và khai báo' def' sau đó tại một số điểm trong lõi). –
@GabrielMitchell có, điều đó đã có thể thực hiện được. Nhưng nó ít hữu ích hơn đối với 'def' hơn là' let', và sẽ thiếu tính đối xứng. 'let' ** luôn luôn ** lấy một vector và các destructures bên trong đó; để làm cho 'def' làm như vậy sẽ làm cho nó ít thuận tiện hơn, và để làm cho def chấp nhận hoặc là một biểu tượng hoặc một hình thức destructuring là IMO khá khủng khiếp. – amalloy
Bạn có thể nói thêm một chút về lý do tại sao một macro như vậy sẽ là tổng? Ngay bây giờ, tôi nghĩ rằng đó là một ý tưởng tuyệt vời - nhưng, dựa trên bình luận của bạn, tôi cũng tự hỏi liệu nó có bằng cách nào đó sẽ chạy ngược lại với hạt Clojure hay không. Thông thường thì tốt hơn là đi với hạt ngôn ngữ hơn là dựng lên thứ gì đó chạy ngược lại nhưng có vẻ hấp dẫn với một người không có kinh nghiệm với ngôn ngữ. Thực tế là sau 10 năm, việc sử dụng một vĩ mô như vậy không phải là phổ biến hơn nữa làm cho tôi tự hỏi nếu nó là một giải pháp vụng về cho một vấn đề tốt nhất giải quyết một cách khác. –