[racket] inherit and apply
At Wed, 1 Dec 2010 20:52:47 +0000, Stephen De Gabrielle wrote:
> I'm getting an error when I try to use 'apply' on an inherited method:
>
> colourwell.rkt:60:47: class: misuse of method (not in application) in: set
>
> I feel I've missed something in my reading of the reference manual for apply
> or inheriting methods, but I don't know where I've gone wrong?
Methods are not values, so a method name cannot be used in an arbitrary
expression position.
(We could have a method name expand to a `lambda' wrapper for a method
call, but we decided not to do that, since it would be an especially
hidden allocation of a closure.)
To apply a method name to a list of arguments, there's a special
syntax. It's not a good syntax, but it's a workable one. Use a dot in
the method-application form before an expression that produces a list
of argument:
(let ([args (hsv->rgb hue saturation value)])
(set-rgb . args))
In this example, I had to lift the `hsv->rgb' call to a local binding,
since
(set-rgb . (hsv->rgb hue saturation value))
is the same as
(set-rgb hsv->rgb hue saturation value)
which isn't what you want --- and that's why the method-apply syntax is
not a good choice.