So, the current version, after the suggestion by Alan Malloy, is the
following:
(defmacro buffer-reduce [b f val]
`(let [b# (.duplicate ~b)
f# ~f]
(loop [remaining# (.remaining b#)
result# ~val]
(if (zero? remaining#)
result#
(recur (dec remaining#) (f# result# (.get b#)))))))
(extend-protocol clojure.core.protocols/CollReduce
java.nio.ByteBuffer
(coll-reduce [b f] (coll-reduce b f (f)))
(coll-reduce [b f val] (buffer-reduce b f val))
java.nio.LongBuffer
(coll-reduce [b f] (coll-reduce b f (f)))
(coll-reduce [b f val] (buffer-reduce b f val))
; ... other kinds of buffer ...
)
About the other suggestions:
- Herwig Holchleitner: how would that solution with protocols be? I write
a protocol that defines methods like `get` and `duplicate` and extend it
for each buffer, delegating the methods to their specific implementations?
ie, (defprotocol UnifiedBuffers (get [buff] "get data from buf") (duplicate
[buff] "duplicates buff")), (extend-protocol UnifiedBuffers ....ByteBuffer
(get [buff] (.get buff)) ....LongBuffer (get [buff] (.get buff))....)?
- David: about the solution you propose, is it somehow considered
"cleaner" or "faster" or "more idiomatic" or, in any way, "better" than the
solution I'm proposing? The advantages might be way more subtle than my
small knowledge of Clojure allow me to understand -- I'm new in the Clojure
community, I might be missing some common idioms. I'd be glad if you could
expand on that!
Thanks!
On Thursday, October 18, 2012 8:44:41 PM UTC-3, David Nolen wrote:
>
> On Thu, Oct 18, 2012 at 7:15 PM, Herwig Hochleitner
> <[email protected]<javascript:>
> > wrote:
>
>> 2012/10/19 Bruno França dos Reis <[email protected] <javascript:>>
>>
>>> The reason why I wrote a macro instead of a function is because 'get'
>>> and 'duplicate' are not declared in any common superclass of the different
>>> buffers, so I was getting lots of reflection!
>>>
>>> Are there alternatives to the macro that avoid reflection?
>>>
>> You could use a protocol for that, though it might not be quite as fast
>> as the directly type hinted version, but certainly faster than reflection.
>>
>> kind regards
>>
>
> Or write a macro that can take a type and create a type specialized
> version of buffer-reduce - long-buffer-reduce, byte-buffer-reduce etc.
>
> David
>
--
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