note
stvn
[FoxTrotUniform],
<P>
Nothing like a good meditation on functional programming to clean out the OOP cobwebs in ones head. Thanks :)
</P>
<P>
You could make your <CODE>build_para</CODE> sub even more Haskell-ish if you removed all assignment statements as well.
<CODE>
sub build_para
{
return $handlers{'para'}->(join "" => map { $handlers{$_->[0]}->($_->[1]) } @{$_[0]});
}
</CODE>
But if we are really gonna get <I>functional</I>, then we might as well make a generic <CODE>build_HTML</CODE> sub and use more recursive datastructures.
<CODE>
my @test_data_2 = ( 'para', [
['none', 'The quick brown '],
['bold', 'fox'],
['none', ' jumped '],
['ital', 'over'],
['none', ' the lazy '],
['bold', 'dog'],
['none', '.']
]
);
sub build_HTML {
join "" => map {
(ref($_->[1]) eq "ARRAY") ?
$handlers{$_->[0]}->(build_HTML(@{$_->[1]}))
:
$handlers{$_->[0]}->($_->[1])
} ref($_[0]) ? @_ : ([ @_ ]);
}
print build_HTML(@test_data_2);
</CODE>
We could then actually use <CODE>build_HTML</CODE> to compose the <CODE>build_para</CODE> subroutine.
<CODE>
*build_para = curry(\&build_HTML, 'para');
print build_para(\@test_data);
</CODE>
</P>
<div class="pmsig"><div class="pmsig-315586">
-stvn
</div></div>
380421
380421