2012-04-09 27 views
5

Tôi biết rằng lồng #,% là xấu - tuy nhiên, tôi thường thấy mình viết các hàm ẩn danh ngắn, trực tuyến có kết quả chính xác là 2 mứC# /% '.Làm tổ số # /% trong các macro clojure

Vì vậy, tôi tò mò, có cách nào để nói một cái gì đó clojure mà mỗi% là ràng buộc để gần nhất (nhỏ nhất bao quanh) #?

Cảm ơn!

+1

Tôi đọc hai lần, nhưng không thể hiểu được câu hỏi của bạn là gì. Bạn có thể làm rõ nó? Nó có thể sẽ giúp bạn có được một câu trả lời hữu ích hơn. –

Trả lời

6

Làm tổ chức năng ẩn danh không được hỗ trợ trong clojure.

Chỉnh sửa: Theo "chức năng ẩn danh", tôi có nghĩa là #(...), không phải (fn ...). Xin lỗi vì sự nhầm lẫn.

+5

'(((fn [x] (fn [y] [x y])) 1) 2)' – danlei

+5

không chính xác như hiển thị danlei. Việc sử dụng lồng nhau của macro trình đọC# (...) cho các chức năng ẩn danh không được hỗ trợ; làm tổ bằng cách sử dụng 'fn' là tốt. – Gert

+2

Vâng, tất nhiên rồi. Nhận xét của tôi đã được hướng vào macro đọc, đó là chủ đề của câu hỏi. –

8

Có chức năng ẩn danh lồng nhau hoàn toàn ổn. Bạn chỉ cần sử dụng cú pháp không viết tắt.

#(foo (bar %1) 
     (baz %2)) 

tương đương với

(fn [x y] 
    (foo (bar x) 
     (bax y))) 

Các biến thể đầy đủ có thể được lồng vào nhau tùy tiện. Ngoài ra, nếu bạn có xu hướng sử dụng map với fn rất nhiều, xem xét sử dụng for thay vì (mà có xu hướng nhìn rõ ràng hơn trong quan điểm của tôi):

(map (fn [row] 
     (map (fn [col] 
       (+ (* 10 row) col)) 
      (range 3))) 
    (range 3)) 

làm điều tương tự như

(for [row (range 3)] 
    (for [col (range 3)] 
    (+ (* 10 row) col))) 
Các vấn đề liên quan