2013-07-23 40 views
26

Tôi khá mới đối với Clojure và tôi không chắc mình hoàn toàn hiểu được sự khác biệt giữa dấu nháy đơn và dấu gạch chéo ngược trong Clojure.Clojure - sự khác biệt giữa '(dấu nháy đơn) và `(backtick)

(def x 5) 

;; Question 1 
(+ x x) ;; evaluates to 10 
'(+ x x) ;; evaluates to (+ x x) 
`(+ x x) ;; evaluates to (clojure.core/+ user/x user/x) 

;; Question 2 
`(~+ ~x ~x) ;; evaluates to (#<core$_PLUS_ [email protected]> 5 5) 
  1. Đúng tôi nếu tôi là sai, nhưng có vẻ như với tôi apostrophe có thể ngăn chặn tất cả các ký tự (ví dụ: + và x) từ giải quyết để tương ứng var của họ, trong khi backtick cho phép các biểu tượng để giải quyết để var của họ (nhưng không đánh giá các giá trị trong var). Nó thật sự đúng?
  2. Biểu tượng unquote (~) chính xác làm gì ở đây? Có phải nó đang đánh giá var đến giá trị thực của nó (tức là biểu tượng + cho đối tượng hàm và biểu tượng x cho đối tượng số) không? Nếu bạn có thể giải thích điều này về các giai đoạn READ-COMPILE-EVAL của Clojure, điều đó cũng sẽ hữu ích.

Trả lời

22

Khi bạn trích dẫn bộ sưu tập với ', tên biểu tượng sẽ được trích dẫn chính xác khi bạn nhập.

'(+ x x) 
=> (+ x x) 
(map namespace *1) 
=> (nil nil nil) 
'(bingo/+ lara/y user/z) 
=> (bingo/+ lara/y user/z) 
(map namespace *1) 
=> ("bingo" "lara" "user") 

Khi bạn trích dẫn một bộ sưu tập có dấu kiểm ngược, nó sẽ tìm không gian tên của mỗi biểu tượng. Nếu nó không thể tìm thấy nó, nó sử dụng không gian tên hiện tại. Nếu bạn chỉ định một không gian tên, nó hoạt động giống như ' với một không gian tên đủ điều kiện.

`(+ x x) 
= > (clojure.core/+ user/x user/x) 
(map namespace *1) 
=> ("clojure.core" "user" "user") 

Khi bạn đang sử dụng ~ bên trong ` biểu mẫu đơn giản sẽ không được bỏ phiếu. Điều này rất hữu ích cho việc xây dựng các macro nơi macro sử dụng các ký hiệu từ không gian tên nó được định nghĩa cũng như các ký hiệu từ không gian tên mà nó được sử dụng.

`(+ ~'x x) 
=> (clojure.core/+ x user/x) 
`(+ ~x x) 
=> (clojure.core/+ 3 user/x) 

Cuối cùng, bạn có thể unquote toàn bộ tập hợp các trích dẫn được trích dẫn.

`(+ [email protected]`(x x)) 
=> (clojure.core/+ user/x user/x) 

Xem cả x es có thể đã được thông qua như là một danh sách các biểu tượng không gian tên-có trình độ và có thể đã được ghép vào một danh sách khác. Bạn không thể sử dụng ~ hoặc [email protected] bên ngoài bộ sưu tập được trích dẫn ngược.

+1

Câu trả lời hay. Có một bài đăng trên blog tuyệt vời ở đây nếu bạn muốn tìm hiểu sâu hơn: https://blog.8thlight.com/colin-jones/2012/05/22/quoting-without-confusion.html –

+1

Xem tất cả các ví dụ đó trực tiếp với KLIPSE http: //app.klipse.tech/?cljs_in=(ns%20my.ns)%0A%0A%5B%0A%20%20 '(% 2B% 20x% 20x)% 20% 0A% 20% 20% 60 (% 2B% 20x% 20x)% 0A% 20% 20% 60 (~ '% 2B% 20x% 20x)% 0A% 20% 20% 60 (% 2B% 20 ~% 40% 60 (% 2B% 20x% 20x))% 0A% 5D% 0A – viebel

2

Backquote là cú pháp trích dẫn theo thuật ngữ Clojure, xem mô tả của nó tại http://clojure.org/reader.

Trong khi đọc, `(~ + ~ x ~ x) mở rộng thành biểu mẫu tạo danh sách có thể tham chiếu đến môi trường từ vựng. Sau đó trình biên dịch biên dịch mã này. Chúng ta hãy xem những gì `(~ + ~ x ~ x) mở rộng tới, thêm vào trước nó với một quote:

user=> '`(~+ ~x ~x) 
(clojure.core/seq (clojure.core/concat (clojure.core/list +) (clojure.core/list x) (clojure.core/list x))) 

Nếu bạn chỉ cần chèn hình thức này trong trình soạn thảo văn bản thay vì` (~ + ~ x ~ x), nó sẽ xây dựng danh sách với + function và hai x's. Vì vậy, `(~ + ~ x ~ x) mở rộng thành mã Clojure xây dựng danh sách cấu trúc cụ thể.

Backquote là loại ngôn ngữ mẫu cho dữ liệu Clojure (danh sách, mảng, v.v ...).

+0

"Cú pháp trích dẫn" thực sự có ý nghĩa gì? – wmock

+0

Nó chỉ là một từ trong tài liệu Clojure. Xem thêm http://stackoverflow.com/questions/3704372/how-does-clojures-syntax-quote-work – monoid

+3

nó có nghĩa là trích dẫn, nhưng trước tiên bạn có ký hiệu đã giải quyết: '+ có nghĩa là' + ', trong khi \ '+ có nghĩa là 'clojure.core/+ ', nhưng nếu bạn nói (def + rest), sau đó \ '+ trở thành' user/+ '- vì vậy đó là biểu tượng giải quyết trong môi trường – Hendekagon

Các vấn đề liên quan