2012-03-18 38 views
20

Trong clojure, tôi muốn biết sự khác nhau giữa ba bên dưới là gì.Trong Clojure, sự khác biệt giữa chức năng, chức năng trích dẫn và hàm trích dẫn sắc nét

(println (map + '(1 2 3) '(4 5 6))) 

(println (map '+ '(1 2 3) '(4 5 6))) 

(println (map #'+ '(1 2 3) '(4 5 6))) 

Kết quả là

(5 7 9) 

(4 5 6) 

(5 7 9) 

Tôi không thể hiểu được hành vi thứ hai của.

Tôi cảm thấy cái đầu tiên và cái thứ ba giống nhau trong clojure là Lisp-1 và không phân biệt giữa việc đánh giá biến và hàm được đặt tên giống nhau.

Đây có thể là câu hỏi cơ bản, nhưng dường như không đủ thông tin. Xin hãy dạy tôi.

Cảm ơn.

+2

Ngoài ra, trong clojure, nó là thành ngữ để mô tả các chuỗi ký tự bằng vectơ thay vì danh sách được trích dẫn. –

+0

Ồ, tôi hiểu rồi. Cảm ơn, Alex. –

Trả lời

32

Liên quan đến trường hợp thứ ba, ngược lại với Common Lisp, #'+ không đọc là (function +) và tham khảo giá trị của ký hiệu + trong không gian tên hàm, vì Clojure không có vùng tên chức năng. Thay vào đó, nó đọc là (var +) và đề cập đến số var được gọi là +. Áp dụng var cũng giống như áp dụng giá trị được lưu trữ trong var.

Trong trường hợp thứ hai, bạn liên tục áp dụng biểu tượng cho một cặp số. Điều này là hợp lệ do tai nạn. Áp dụng một biểu tượng để bản đồ cũng giống như đánh chỉ vào bản đồ rằng:

user> ('a {'a 1, 'b 2, 'c 3, '+ 4}) 
1 
user> ('+ {'a 1, 'b 2, 'c 3, '+ 4}) 
4 

Nếu bạn cung cấp một số thứ hai, nó được sử dụng như là giá trị mặc định trong trường hợp không có khóa khớp được tìm thấy trong bản đồ:

user> ('+ {'a 1, 'b 2, 'c 3} 4) 
4 

Vì trong mỗi lần lặp, bạn áp dụng ký hiệu + cho một số và vì số không phải là bản đồ và do đó không chứa + làm khóa, đối số thứ hai được trả về làm giá trị mặc định của một trận đấu không thành công.

user> ('+ 'foo 4) 
4 
user> ('+ {} 4) 
4 
user> ('+ 1 4) 
4 
+0

Câu trả lời hay. Giải thích rõ ràng về hành vi không rõ ràng ngay lập tức. Cảm ơn. – sw1nn

+0

Cảm ơn rất nhiều, Matthias. Tôi có thể hiểu những gì # 'có nghĩa là. Tôi không nhận ra Var, và tôi lờ nó đi, nhưng lần này tôi có thể hiểu nó sâu sắc hơn. Tôi cũng có thể hiểu được hành vi mã thứ 2. Cảm ơn bạn. –

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