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 `$x`

and `$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.

### Like this:

Like Loading...

*Related*

This entry was posted on May 7, 2010 at 1:41 pm and is filed under Uncategorized. You can follow any responses to this entry through the RSS 2.0 feed.
You can leave a response, or trackback from your own site.

## Leave a Reply