Điểm của syntax-quote
, unquote
và unquote-splicing
là để giúp nhà phát triển viết macro.
Ví dụ, không syntax-quote
và unquote
bạn sẽ phải viết
user=> (list :a extra-values)
(:a [1 2 3 4])
thay vì:
user=> `(:a ~extra-values)
(:a [1 2 3 4])
Trong trường hợp trước đó là khó khăn hơn cho người đọc (đọc của con người - không phải là repl) để hiểu biểu mẫu kết quả sẽ trông như thế nào, trong khi trường hợp thứ hai duy trì 'hình dạng' của biểu mẫu kết quả.
Vì vậy, nếu thay vì vector
[1 2 3 4]
, chúng tôi muốn ghép các nội dung của extra-values
làm thành phần biểu mẫu kết quả?Chúng ta cần unquote-splicing
để chúng ta có thể viết:
user=> `(+ 100 200 [email protected])
(clojure.core/+ 100 200 1 2 3 4)
thay vì:
user=> (concat `(+ 100 200) extra-values)
(clojure.core/+ 100 200 1 2 3 4)
Một lần nữa phiên bản unquote-splicing
cho phép mã để giống với các 'hình' của mẫu kết quả khi mã được đánh giá, trong khi trong phiên bản thứ hai, 'hình dạng' bị mất trong tiếng ồn của apply
và list
.
Cả hai ví dụ này rất đơn giản, nhưng syntax-quote
và bạn bè thực sự đến với riêng mình khi viết các macro phức tạp hơn.
Quay lại câu hỏi tại sao bạn không thể viết (+ 1000 [email protected])
? Chúng tôi đã có mà chức năng trong apply
(với một vài hạn chế hơn):
user=> (apply + 1000 extra-values)
1010
Có lẽ để tránh pha trộn của "Meta" tính năng của ngôn ngữ với tính năng "bình thường" cho ngôn ngữ :) – Ankur