I don't understand why you didn't go the easy way of defining my %rtoa either on file or function scope.
Though that was easier, I am pedantic and just couldn't bring myself to do it:
- I didn't want %rtoa at file scope because other functions in the same file have no business knowing about its existence - it is a roman_to_dec() implementation detail after all and I should be able to later change the implementation of this function with complete confidence that doing so cannot possibly break other functions in the same file ... which is why I originally created the bare block, solely to hide %rtoa from other functions in the same file.
- I didn't want my %rtoa at function scope because it is gratuitously inefficient to (unnecessarily) initialise %rtoa each and every time the function is called (it is a constant after all). More importantly, expressing that %rtoa is const and is used only by roman_to_dec aids code clarity (BTW, I miss C++'s const keyword when coding in Perl).
BTW, it seems to me that state variables were added to perl expressly to solve the above two concerns.
Update: Re the rationale for introducing state variables, found a quote from Larry himself in Re: About "state" variables in Perl 5.10:
However, that difference is not why we introduced state variables. The big win is the psychological one of not having to look outside of the sub to find the definition of $x. (That, and we wanted it as a primitive in Perl 6 so that people could write stateful macro constructs without forcing the user to define the state variable externally; in fact, we also use it ourselves in order to implement the stateful flipflop operator without having to build the flipflop in as a primitive, as it is in Perl 5.)
| [reply] [Watch: Dir/Any] [d/l] [select] |
yeah, I understand your aspiration for 100% solutions.
But it's a Rosetta Stone fire-and-forget demo script and I doubt we'd see any other function added.
Or do you expect a need for sumerian_to_maya() soon? ;-)
> (BTW, I miss C++'s const keyword when coding in Perl).
why not ...
use Readonly;
Readonly my %has => (key => value, key => value, ...);
If that's too ugly, we could try to define an attribute to do so.
my %has :ro = (key => value, key => value, ...);
| [reply] [Watch: Dir/Any] [d/l] [select] |
| [reply] [Watch: Dir/Any] [d/l] |