The following program compiles and runs perfectly fine in both 1.2 and 1.3 alpha1. It has no reflection warnings in 1.2, but it does in 1.3 alpha1. I have tried several variations, but I haven't yet been able to figure out how to write type declarations that avoid reflection in 1.3 alpha1. Does anyone know whether this is a bug?

Or perhaps code like this ought to be structured completely differently in order to avoid reflection, and it was just a fluke that it worked in 1.2?

Thanks,
Andy

(ns nbody
  (:gen-class))

(set! *warn-on-reflection* true)

(definterface IBody
  (^double x [])
  (^double y [])
  (^double z [])
  (^double dist [other]))

(deftype Body [^{:unsynchronized-mutable true :tag double} x
               ^{:unsynchronized-mutable true :tag double} y
               ^{:unsynchronized-mutable true :tag double} z ]
  IBody
  (x [this] x)
  (y [this] y)
  (z [this] z)
  (dist [this other]
        (let [^Body nbody other
              dx (- x (.x nbody))   ; first reflection warning here
              dy (- y (.y nbody))   ; second here
              dz (- z (.z nbody))   ; third here
              dsq (+ (* dx dx)
                     (+ (* dy dy)
                        (* dz dz)))]
          (Math/sqrt dsq))))

(defn -main [& args]
  (let [b (Body. 0 0 0)]
    (println "pos:" (.x b) (.y b) (.z b))))

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to