Article: Writing Julia style multiple dispatch code in D
jmh530 via Digitalmars-d-announce
digitalmars-d-announce at puremagic.com
Thu Aug 24 14:13:10 PDT 2017
On Thursday, 24 August 2017 at 20:11:32 UTC, data pulverizer
wrote:
>
> Thanks. I think most of that is down to D's nice syntax and how
> it easily and clearly emulates Julia. I think that there is
> certainly more to say on this especially around strategies of
> how represent concrete types. David Gileadi's point about UDAs
> could add an interesting spin on things, and Ali's point on
> dynamic dispatching.
>
On UDAs, at least in the current implementation, I think that the
actual issue you are trying to address is to force the type in
the distribution to be convertible to double in the continuous
case and convertible to long in the discrete case. All things
considered, that can be implemented with template constraints, as
in
class Gamma(T):
if(isFloatingPoint!T)
{
immutable(T) shape;
immutable(T) scale;
this(T shape, T scale)
{
this.shape = shape;
this.scale = scale;
}
}
though you could probably take a more abstract approach. (I'm
also not 100% on having immutable member variables). Also,
density's signature could then avoid the template constraint.
auto density(D: Gamma!T, U : T, T)(D d, U x)
Even better, if you're calling the dstats functions, you could
re-write density as something like
auto pdf(D: Dist!T, U : T, Dist, T)(U x, D d) {
mixin("return x." ~ lookupdstatdensity!Dist ~ "(" ~
stringmembersofd ~ ")";
}
and create a lookupdstatdensity function that returns a string of
the relevant dstats function at compile-time (and a function
returning a string of the members of d) (I also would re-name
density to pdf and switch the order of x and d). This would
probably be the most DRY approach.
On Ali's point on dynamic dispatching, Julia is a scripting
language with a JIT compiler. So if you call a function with some
types known at compile time and the overload exists, it will
compile the correct version of the function for the relevant
types. It will then cache that so that if you need it again you
don't pay any additional cost. So it's similar to what you're
doing on that respect. However, there is a runtime dispatch
component that would take something like openmethods to
implement, I think.
More information about the Digitalmars-d-announce
mailing list