2011-06-12 43 views
23

Trong Clojure bạn có thể viết:lý do tại sao: khác không (khác) trong clojure?

(cond (= 1 2) 1 
     :else 5) 

Trong Đề án tương đương sẽ là:

(cond ((= 1 2) 1) 
     (else 5)) 

Cú pháp :else 5 là không nhất quán như (else 5). Lý do cú pháp khác được thực hiện theo cách này dường như không nhất quán trong Clojure là gì?

+0

Cảm ơn tất cả các câu trả lời hay. Tất cả đều có giá trị gia tăng. – steenhulthin

Trả lời

26

Tôi nghĩ rằng (else 5) ít phù hợp hơn. Các đối số (cond ...) được ghi là cặp giá trị điều kiện. :else value nhất quán vì :else chỉ là một quy ước - nó hoạt động vì :else chỉ là một biểu thức luôn đúng. Không có quy tắc đặc biệt nào cho số :else.

3

Có nhiều lý do; chủ yếu là tôi nghĩ rằng đó là vì cond được triển khai dưới dạng macro xung quanh if. Mặt khác, trong Đề án else chỉ là một từ đồng nghĩa với t trong ngữ cảnh này; nó không phải là một cuộc gọi chức năng, vậy tại sao làm cho nó trông giống như một?

+2

Thực tế là 'cond' được thực hiện như một macro có liên quan như thế nào? –

+0

Do macro có cú pháp khác với hàm. –

34

:else là một thực sự là một chút của một thủ thuật thông minh ở đây:

  • cond hy vọng cặp tình trạng/giá trị - và: khác chỉ là một giá trị đó là "truthy" trong Clojure nên nó đảm bảo rằng điều kiện được thỏa mãn. (bất cứ điều gì ngoại trừ null hoặc giả được tính là "sự thật"). Bạn có thể sử dụng "donkey" như một giá trị điều kiện thực sự được bảo đảm nếu bạn thích.
  • Tuy nhiên,: khác cũng chuyển tải ý nghĩa cho một độc giả nhân (tức là tình trạng này là một trong những để được thực thi nếu không ai trong số các trận đấu các điều kiện khác

Vì vậy, thực sự nó chỉ là một quy ước mà làm việc trong cond biểu và có ý nghĩa với độc giả của con người

3

99% thời gian, các dấu ngoặc trong Clojure hàm ý một hàm hoặc lệnh gọi macro, điều này trái ngược với một số Lisps khác sử dụng các phần tử để nhóm. trong các liên kết fn hoặc let, bạn sẽ sử dụng [] instea d.

Rich thảo luận một phần lý do đằng sau việc thực hiện thay đổi này trong một cuộc phỏng vấn gần đây here. Tóm lại, nó giúp làm cho mã dễ đọc hơn, bởi vì bạn không phải mất thời gian để tìm ra những parens đại diện cho cái gì.

+0

nhưng: nó là hợp lệ clojure; nó sẽ ném một ngoại lệ – naiad

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