2011-02-07 39 views
21

Tôi đã viết một chức năng ẩn danh nhỏ để sử dụng với cuộc gọi map. Hàm trả về một vectơ chứa một tên cột và giá trị cột từ một truy vấn tập kết quả SQL.Clojure: trả lại véc tơ từ chức năng ẩn danh

Dưới đây là chức năng (đầu vào là tên cột):

(fn [name] [(keyword name) (.getObject resultset name)]) 

này hoạt động tốt, tuy nhiên khi tôi cố gắng sử dụng một phiên bản "đơn giản hóa" của các chức năng ẩn danh, tôi đã nhận ra lỗi:

#([(keyword %) (.getObject resultset %)]) 

java.lang.IllegalArgumentException: Wrong number of args (0) passed to: PersistentVector 

đây là map gọi:

(into {} (map (fn [name] [(keyword name) (.getObject resultset name)]) column-names)) 

có thể sử dụng simpl cú pháp ified cho hàm này? Nếu vậy, làm thế nào?

Cảm ơn.

+0

Một số biết thêm thông tin: http://groups.google.com/group/clojure/browse_thread/thread/9037f31748cef0e2/62d3f3a45a139157?lnk=gst&q= Nick + Zbinden # 62d3f3a45a139157 – nickik

Trả lời

24

Vấn đề của bạn là cú pháp đơn giản đang cố gắng đánh giá vectơ như một cuộc gọi hàm.

Bạn có thể chèn một "bản sắc" chức năng để làm cho nó hoạt động, vì đây là chỉ là một chức năng đơn giản mà sẽ trả lại vector không thay đổi:

#(identity [(keyword %) (.getObject resultset %)]) 
+0

Tôi đã chọn câu trả lời này vì nó cũng giải thích tại sao vấn đề xảy ra, mặc dù câu trả lời của Alex Ott cũng hoạt động (và cung cấp giải pháp chung cho các cấu trúc dữ liệu khác). Cảm ơn tất cả. – Ralph

+0

Tôi đã chỉnh sửa câu trả lời này để kết hợp đề xuất của Alex, nhưng có vẻ như nó đã bị bỏ qua vì một lý do nào đó. Oh well. – apg

+0

Tôi đã thêm một ví dụ về giải pháp lý tưởng hơn là chỉ hiển thị mã chứng minh lý do tại sao nó không hoạt động. Vì bạn chỉnh sửa không mất. – Psyllo

23

Bạn cần phải sử dụng vector chức năng để làm điều này:

#(vector (keyword %) (.getObject resultset %)) 

PS cũng có các chức năng cho bản đồ, bộ, v.v.

4

Vâng, Clojure thực sự nên hỗ trợ cấu trúC# [...], chỉ dành cho trường hợp này.

Tôi muốn giới thiệu sau đây là phương án tốt nhất:

#(vector (keyword %) (.getObject resultset %)) 
+2

Tôi không nghĩ rằng [[]] sẽ đủ phổ biến để đảm bảo cú pháp đặc biệt cho nó, và một khi bạn tìm hiểu về nó, việc ném 'vector' trong đó không phải là một vấn đề lớn. – apg

+0

Tôi nghĩ về cùng một cấu trúc '# [...]'. Làm thế nào tôi có thể viết một macro cho nó? # có nghĩa là macro trình đọc phải không? –

+0

Bạn có thể viết '# (-> [(từ khóa%) (.getObject resultset%)])', nhưng tôi thấy điều này không rõ ràng –

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