I’ve been having a terrible time getting the log method to work in the Numeric / Real framework. Essentially, the problem is that there are two different concepts of log going on: log with respect to a specified base, which is defined in terms of the natural log. Perl 6’s log command combines these two into one function, with a default base of e. Still, splitting up the function into a multi was the easiest way to implement this:
multi method log(Num $x:), which is used to implement
multi method log(Num $x: Num $base).
That worked fine when log was not a part of Numeric or Real, but failed in different mysterious ways each time I tried to extend it to those roles. Finally this week I realized the problem: multis and roles do not mix yet in Rakudo. At all.
Knowing that, it was easy to figure out what the next step should be. I just renamed the natural log function to be
log-e. (Think I will rename it to
ln in a second.) Then I implemented
method log(Numeric $x: Numeric $base = e) using it. This has the additional advantage of properly supporting logs where
$base are different types. As long as each type has
log-e defined for it, and the results of those calls can be divided, the mixed type will be handled properly.
This works well in current Rakudo. Pleased with this, I went on to move the sin method to Numeric and Real as well — the trick there turned out to be removing multi from the declarations of Num.sin and Complex.sin. With that established, porting all the trig functions to the new system is just a matter of time. I do need to sit down and rethink the trig tests a bit.
Thanks to the Perl Foundation and Ian Hague for supporting this work.