2011-10-12 4 views
7

Làm cách nào để tôi có thể vượt qua một chuỗi đơn lẻ làm đối số cho hàm nhiều đối số? Cụ thể, tôi đang cố gắng sử dụng cartesian-product và chuyển nó một chuỗi (xem bên dưới); tuy nhiên, khi tôi làm như vậy kết quả không phải là kết quả mong muốn. Nếu tôi không thể vượt qua một chuỗi duy nhất làm đối số, làm thế nào tôi có thể/tôi nên chia chuỗi thành nhiều đối số? Cảm ơn.Vượt qua chuỗi làm đối số ở vị trí của nhiều đối số

(use '[clojure.contrib.combinatorics :only (cartesian-product)]) 
(cartesian-product (["a" "b" "c"] [1 2 3])) 

Kết quả trong:

((["a" "b"]) ([1 2])) 

kết quả mong muốn

(("a" 1) ("a" 2) ("b" 1) ("b" 2)) 

Trả lời

8

các apply chức năng xây dựng một cuộc gọi chức năng từ một chức năng và một chuỗi chứa các đối số cho hàm.

(apply cartesian-product '(["a" "b" "c"] [1 2 3])) 
(("a" 1) ("a" 2) ("a" 3) ("b" 1) ("b" 2) ("b" 3) ("c" 1) ("c" 2) ("c" 3)) 

như một ví dụ khác:

(apply + (range 10)) 

đánh giá (range 10) thành một chuỗi (0 1 2 3 4 5 6 7 8 9) và sau đó xây dựng chức năng này gọi

(+ 0 1 2 3 4 5 6 7 8 9) 


và trở lại do nhu cầu phổ biến:

cho tunatly cho chức năng này độc đáo.

(for [x ["a" "b"] y [1 2]] [x y]) 
(["a" 1] ["a" 2] ["b" 1] ["b" 2]) 
+0

xin lỗi vì sự chơi chữ ... Tôi sẽ chỉnh sửa để thêm một câu trả lời thật cũng trong một khoảnh khắc –

+0

chơi chữ gỡ bỏ bởi nhu cầu phổ biến: -/ –

+0

sự chơi chữ là gì? – Ari

1

apply là một cách như Arthur cho thấy.

Một khả năng khác cần xem xét là destructuring. Cụ thể véc tơ lồng nhau ràng buộc:

 
user=> (let [[v1 v2] '([:a :b] [1 2])] 
     (cartesian-product v1 v2)) 

+0

Cảm ơn bạn đã chia sẻ giải pháp thay thế; Tôi đánh giá cao nó. Tôi đã chọn đề xuất của Arthur, bởi vì đối số chuỗi, trong vấn đề của tôi, có kích thước biến đổi. – Ari