2012-03-09 30 views
7

Tôi đang làm Intro to Functions vấn đề, nhưng tôi không hoàn toàn hiểu những gì đang xảy ra? 4 biểu thức dưới đây khác nhau như thế nào? Nếu tất cả đều giống nhau, tại sao có 4 cú pháp khác nhau?Chức năng Clojure Literals

(partial + 5) 
#(+ % 5) 
(fn [x] (+ x 5)) 
(fn add-five [x] (+ x 5)) 

Trả lời

18
  • (fn [x] (+ x 5))#(+ % 5) - Hai là hoàn toàn tương đương, sau này chỉ sử dụng dispatch macro để làm cho đoạn code ngắn gọn hơn một chút. Đối với các hàm ngắn, cú pháp #() thường được ưu tiên và cú pháp (fn [x]) tốt hơn cho các hàm dài hơn một chút. Ngoài ra, nếu bạn có các chức năng ẩn danh lồng nhau, bạn không thể sử dụng #() cho cả hai vì sự mơ hồ này sẽ gây ra.

  • (fn add-five [x] (+ x 5)) - giống như hai trường hợp trên, ngoại trừ tên có: bổ trợ. Điều này đôi khi có thể hữu ích, như khi bạn cần thực hiện một cuộc gọi đệ quy đến chức năng của bạn. *

  • (partial + 5) - Trong clojure, + là một hàm variadic. Điều này có nghĩa là nó có thể chấp nhận bất kỳ số lượng đối số nào. (+ 1 2)(+ 1 2 3 4 5 6) là cả hai hình thức hoàn toàn hợp lệ. partial đang tạo một hàm mới giống hệt với +, ngoại trừ đối số đầu tiên luôn là 5. Do đó, ((partial + 5) 3 3 3) là hợp lệ. Bạn không thể sử dụng các biểu mẫu khác trong trường hợp này.

* Khi thực hiện cuộc gọi đệ quy từ vị trí đuôi, bạn nên sử dụng recur, tuy nhiên điều này không phải lúc nào cũng có thể.

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