I had an idea, and as I worked on it, two forms emerged.
Blessed Objects:
$"='|';$|=$d=1;@b=map{bless{t,"$_ ",r,$d*=-1}}qw/Just another Perl hacker,/;sub v{$s=shift;my$_=$$s{t};$r=int y===c*$$s{a}/360;$$s{a}= ($$s{a}+$$s{r})%360;s%(.{$r})(.*)%$2$1%;$_}{print"\r@{[map{v$_}@b] }";select$x,$y,$z,2e-3;redo}
This section doesn't contain spoilers per se, but a discussion of how it evolved.
It should come as no surprise as you look it over that it started out as a relatively clean implementation of a class that gets instantiated into several blessed objects. There were the usual accessors and the usual call to a subroutine designated as a constructor.
Little by little I found chunks that could be removed, condensed, written a more obscure way, and so on. In some cases member functions that were used only once got inlined into a single member function. Then the constructor got pulled out of the customary function and into a loop's block. In the end, I got 228 keystrokes (231 if you count newlines, which are significant), and something pretty funky.
If I had stopped there, all I would have posted would be the preceding code and a little wisecrack or something.
But then I started thinking about the fact that with Perl, functions can be used as first class objects themselves thanks to closures and subrefs. (Obviously this isn't a new discovery, but it's sometimes overlooked.) This seemed like a perfect example of where that sort of approach could work out nicely. That idea led to a second quest, and here's how it turned out."
Functional Objects:
$"='|';$|=$d=1;@b=map{my($t,$h,$a)=("$_ ",$d*=-1);sub{my$_=$t;$r=int y===c*$a/360;$a=($a+$h)%360;s%(.{$r})(.*)%$2$1%;$_}}qw/Just another Perl hacker,/;{print"\r@{[map{&$_}@b]}";select$x,$y,$z,2e-3;redo}
The extra discussion may be unconventional for this sort of post, but I just enjoyed the process and felt like sharing a little about it.
Enjoy!
Dave
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Objects: Classical and Functional
by ambrus (Abbot) on Oct 25, 2011 at 09:42 UTC | |
by davido (Cardinal) on Oct 25, 2011 at 10:22 UTC | |
|
Re: Objects: Classical and Functional
by ambrus (Abbot) on Oct 25, 2011 at 18:45 UTC |