Hi Karsten, It looks to me like you're trying to define some small fixed-size numeric double vectors and related operations? For graphics, games or physical modelling perhaps?
Perhaps you've already evaluated all the options and decided that a bunch of custom deftypes is the best way go, but in case you haven't seen it already, can I recommend considering my little library vectorz-clj? I designed it specifically to handle this kind of use case in Clojure, and it includes: - Fixed size 1-4D Vectors, with many specialised methods for high performance - Specialised 2D and 3D transformation matrices (rotations, scaling etc.) - Affine transformations - core.matrix fully supported (which gives you a lot of more general matrix/vector features with a nice Clojure API) See: https://github.com/mikera/vectorz-clj And core.matrix: https://github.com/mikera/matrix-api If vectorz-clj and/or core.matrix doesn't quite fit your needs, could you let me know why? I'm keen to address all the common vector use cases that people have in Clojure, so that people can avoid reinventing the wheel. On Thursday, 12 September 2013 07:41:34 UTC+8, Karsten Schmidt wrote: > > Hi, I'm (once again) despairing over some issues trying to integrate > one macro with another. Both are supposed to be used together to > generate a bunch of deftypes. Firstly, here's the one working > correctly (stripped out error checking for simplicity): > > (defmacro swizzle* > "Takes a class name, source instance, keyword and metadata map, > returns new instance of type with fields populated based on > decomposed single letter key lookups. E.g. > > (macroexpand-1 '(swizzle* Vec3 v :zyx)) > #_=> (new Vec3 (. v z) (. v y) (. v x) {}) > > (macroexpand-1 '(swizzle* Vec3 v :xxz)) > #_=> (new Vec3 (. v x) (. v x) (. v z) {}) > " > [clz src k meta] > `(new ~clz > ~@(->> k > (name) > (map (comp symbol str)) > (map (fn [f] `(. ~src ~f)))) > ~meta)) > > Now, where things go wrong is when I try to use this swizzle macro > from within the 2nd macro which generates the deftype skeleton (also > stripped down): > > (defmacro defvec > [n] > (let [vname (symbol (str "Vec" n)) > syms (map (fn [s] (-> s str symbol)) (take n "xyzw"))] > `(deftype ~vname [~@syms __meta#] > > clojure.lang.IObj > (meta [this#] __meta#) > (withMeta [this# mm#] (new ~vname ~@syms mm#)) > > clojure.lang.ILookup > (valAt [this# k#] (swizzle* ~vname this# k# __meta#)) ;; FIXME > ))) > > (defvec 3) > CompilerException java.lang.IllegalArgumentException: No matching ctor > found for class compile__stub.user.Vec3, > compiling:(NO_SOURCE_PATH:1:1) > > =:_( > > I've been trying a lot of other versions (e.g. inline swizzle*, > defining it as local fn etc.), but honestly I don't understand why > this fails and would really appreciate some further insights into > these aspects of the dark art of macro voodoo. > > Furthermore (for the future), in that second macro how can I add type > hints to the generated field names (they should all be doubles)... > > Thanks a lot! > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.