2010-04-30 32 views
5

Cách đây một đoạn mã này dường như hoạt động, nhưng bây giờ nó không còn nữa. Có điểm nào sai không?Hàm tổng hợp không hoạt động:/

user=> (defn sum [a b] (a + b)) 
#'user/sum 
user=> (sum 3 4) 
java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0) 
user=> 

Đây có thể là thời gian để nghỉ ngơi :)

Trả lời

9

Có lẽ thử:

(defn sum [a b] (+ a b)) 

Clojure, là một thành viên của gia đình Lisp, luôn luôn sử dụng tiền tố ký hiệu cho các biểu thức số học.

+0

Vâng, tôi đã quên. – StackedCrooked

2

Vì bạn đang cố gắng viết một hàm như vậy, tôi tự hỏi nếu có thể hữu ích khi chỉ ra rằng + chỉ là một hàm bình thường trong Clojure, vì nó nằm trong bất kỳ Lisp nào khác. Trong thực tế, không có "biểu thức số học" đặc biệt trong Clojure, chỉ các ứng dụng chức năng có đối số là số và có các hàm toán tử thực hiện các phép tính số học. Trên thực tế, trong hầu hết các Lisps, không có "toán tử" đặc biệt nào trong các phần cú pháp phân biệt ý nghĩa cần được bọc cho chức năng của chúng để có sẵn dưới dạng một hàm. Clojure là bất thường như một Lisp trong lĩnh vực này ở chỗ nó rõ ràng phụ thuộc vào nền tảng máy chủ của nó cho một số tính năng khá cơ bản; ví dụ. nổi exponentiation có sẵn trong vanilla Clojure trong các hình thức của pow phương pháp của các lớp học java.lang.Math (nhưng xem clojure.contrib.math cho một số chức năng tốt đẹp để thực hiện các số học số khác nhau không trong clojure.core).

Phương pháp Java sẽ phải được bao bọc trong Clojure để được sử dụng làm chức năng (ví dụ: được chuyển đến map v.v.), vì vậy theo cách đó, chúng có thể mang đến cho người vận hành tâm từ các ngôn ngữ như C, Python hoặc thực sự Java. Chúng vẫn được gọi là sử dụng ký pháp tiền tố.

2
  • Đã có một chức năng + trong clojure.core, vì vậy hãy cẩn thận khi xác định lại nó, có lẽ bạn nên tránh điều này.
  • Tất cả Lisps bao gồm ký hiệu tiền tố sử dụng Clojure. Bạn nên gọi một hàm như (fn-name args). Trong ví dụ của bạn, Clojure cố gắng gọi một số nguyên như một hàm, vì đó là phần tử đầu tiên của danh sách. Số nguyên không triển khai giao diện IFn, do đó giải thích thông báo lỗi.
  • Thực tế, bạn có thể nhận được một ký hiệu infix cho các hàm toán học bằng cách sử dụng một hàm. Đối với chức năng này, xem trang 13 của chương đầu tiên của The Joy Of Clojure, có sẵn miễn phí tại đây: http://www.manning.com/fogus/Fogus_MEAP_Ch1.pdf.
+0

Mặc dù ví dụ infix cụ thể đó sẽ không biến nó thành bản nháp cuối cùng, tôi nên lưu ý rằng nó được thực hiện như một hàm, chứ không phải là một macro. – fogus

+0

@fogus Đã chỉnh sửa tương ứng. –

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