ferreira has asked for the wisdom of the Perl Monks concerning the following question:
That was done with a bit of overload, AUTOLOAD and a part which I am not satisfied with.use Acme::Roman; print I + II; # III, as expected
Some digression first. The idea came to me a long time ago from the solution to a Ruby quiz, namely
Ruby Quiz - Roman Numerals (#22)(See the hightlighted solution at the Quiz Summary in the same page.) The trick in Ruby was done by defining strategic methods method_missing (which is kind of Perl AUTOLOAD) and const_missing. The Perl solution was quite natural, and I got to the point where
worked fine. But when I left the parentheses, it only barfed at me withuse Acme::Roman; print I() + II(); # III
and$ perl -w -Ilib -MAcme::Roman -e 'my $x = I+II' Argument "II" isn't numeric in addition (+) at -e line 1. Argument "I" isn't numeric in addition (+) at -e line 1.
which revealed the barewords were not resolved with the provided AUTOLOAD. I learned that if I provided an empty protoype it worked. And that's how I coded -- but that kind of sucks: I need to define the prototype of 3999 subs (I .. MMMCMXCIX) to make it work. I think that's too expensive. (Who would like to play with an Acme module which is as heavy as a useful module? ;-)$ perl -w -Ilib -MAcme::Roman -e 'print I+II' Name "main::I" used only once: possible typo at -e line 1. print() on unopened filehandle I at -e line 1.
The Ruby solution is helped by the availability of const_missing method functionality. The equivalent in Perl would be to overload barewords, but overload documentation says:
Barewords are not covered by overloaded string constants.
Does anyone have any suggestion to make this lazier? Or a different way to implement that?