On Mon, 04 Jul 2011 12:12:33 +0200, Svante Carl v. Erichsen wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Am 04.07.2011 11:31, schrieb Tamas Papp:
Why do some CL library functions have :key arguments?
I am asking because I am working on some statistics functions, and the design choice came up. Specifically, I can write functions like
(defun quantiles (sequence quantiles &key (key #'identity)) ...)
but it is a bit cumbersome. I can make my code simpler by relying on calls like
(quantiles (map 'vector key vector) quantiles)
but this conses a bit more.
Doesn't quantiles just pass the key to sort? Is there some smarter algorithm I am not aware of right now?
Eg
@inproceedings{greenwald2001space, title={Space-efficient online computation of quantile summaries}, author={Greenwald, M. and Khanna, S.}, booktitle={ACM SIGMOD Record}, volume={30}, number={2}, pages={58--66}, year={2001}, organization={ACM} }
I am making quantiles a generic function: it should work on objects returned by the method above, and also on vectors. My problem was that
(quantiles quantile-summary #(0.25 0.5 0.75) :key something)
makes little sense, since the summary is already accumulated. So I will drop key for the moment, and will probably use compiler macros.
I also thought of a lazy solution that would just save the function and the object, and traverse once, eg
(quantiles (with-key function object) ...)
but I need to think about that.
Also, passing the key lets you return the complete objects (or whatever), not just the keys as in the map call. For example, compare
That's a good point, I didn't think of that.
Best,
Tamas