2010-09-23 59 views
7

Làm cách nào để nhập gợi ý này để loại bỏ các cuộc gọi phản chiếu còn lại?Cách nhập gợi ý

(def B 
    (amap ^"[[D" A i ^"[[D" B 
      (amap ^doubles (aget A (int i)) j ^doubles row 
      (* 2 (aget row (int j)))))) 

Có hai cuộc gọi phản ánh trái, nhưng tôi không biết cách loại bỏ chúng.

+0

Tôi có lẽ nên nói những gì tôi nghĩ rằng mã đang làm trong trường hợp tôi làm hỏng nó lên. Tôi chỉ cố gắng nhân tất cả các phần tử trong một mảng java 2d bằng cách sử dụng amap. – 2daaa

Trả lời

3

Bạn không hiển thị mã hoàn chỉnh của bạn hoặc những lời cảnh báo phản ánh, nhưng nếu họ là những gì tôi nghĩ họ đang có, bạn sẽ cần phải :

  1. gợi ý A: (def ^"[[D" A ...) bất cứ nơi nào bạn định nghĩa nó
  2. đúc giá trị trả về của biểu thức trong cùng để đôi: (double (* 2 ...))

Quá trình để tìm ra các bản sửa lỗi này là thực hiện macroexpand trên macro, chạy phiên bản đó, xem biểu thức nào đang gây ra cảnh báo phản chiếu, sửa chúng và hy vọng bạn có thể trang bị thêm các gợi ý vào macro gốc, trường hợp này là có thể. Tôi vẫn khuyên bạn nên giải pháp đơn giản hơn.

1

IMHO này là dễ dàng hơn để làm không có macro Amap:

(set! *warn-on-reflection* true) 
(def ^"[[D" A (into-array [(double-array [0 1 2]) (double-array [2 3 4])])) 

(def ^"[[D" B (into-array (map aclone A))) ; aclone is shallow 
(dotimes [i (alength B)] 
    (let [^doubles row (aget B i)] 
    (dotimes [j (alength row)] 
     (aset row j (double (* 2 (aget row j))))))) 

(doseq [row B] 
    (prn (vec row))) 
+0

Cảm ơn, tôi đã có một giải pháp dọc theo những dòng đó. Tôi thực sự quan tâm đến việc so sánh mã phong cách bắt buộc mà bạn đã viết cho phong cách chức năng hơn bằng cách sử dụng amap. – 2daaa

+1

Lưu ý rằng amap là một macro mở rộng đến một cái gì đó rất giống với giải pháp bắt buộc. –

0

Trang này (cuối cùng) cung cấp thông tin tốt về gợi ý loại: http://clojure.org/java_interop. Đề xuất sử dụng ví dụ: (cho phép [n (int)]) thay vì^Integer vv, điều này cũng làm cho mã dễ đọc hơn nhiều. Lưu ý rằng rất nhiều tài liệu trên internet có vẻ như dành cho các phiên bản cũ hơn của Clojure và bạn cần ít gợi ý về loại hơn trong 1.2.

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