Same fringe: Difference between revisions

Content added Content deleted
m (→‎{{header|Perl 6}}: useless newline)
(→‎{{header|Perl 6}}: the gather {*} thing does not work anymore for some reason)
Line 1,151: Line 1,151:
{{Works with|Rakudo|#67 ("Bicycle")}}
{{Works with|Rakudo|#67 ("Bicycle")}}
Unlike in Perl 5, where <tt>=></tt> is just a synonym for comma, in Perl 6 it creates a true Pair object. So here we use Pair objects for our "cons" cells, just as if we were doing this in Lisp. We use the <tt>gather/take</tt> construct to harvest the leaves lazily as the elements are visited with a standard recursive algorithm, using multiple dispatch to differentiate nodes from leaves. The <tt>eqv</tt> value equivalence is applied to the two lists in parallel.
Unlike in Perl 5, where <tt>=></tt> is just a synonym for comma, in Perl 6 it creates a true Pair object. So here we use Pair objects for our "cons" cells, just as if we were doing this in Lisp. We use the <tt>gather/take</tt> construct to harvest the leaves lazily as the elements are visited with a standard recursive algorithm, using multiple dispatch to differentiate nodes from leaves. The <tt>eqv</tt> value equivalence is applied to the two lists in parallel.
<lang perl6>proto fringe($) { gather {*} }
<lang perl6>sub samefringe ($a, $b) { fringe($a) eqv fringe($b) }
multi fringe(Pair $node) { fringe $_ for $node.kv }
sub fringe ($tree) {
multi fringe(Any $leaf) { take $leaf }
multi sub fringey (Pair $node) { fringey $_ for $node.kv; }
multi sub fringey ( Any $leaf) { take $leaf; }

gather fringey $tree;
}

sub samefringe ($a, $b) { fringe($a) eqv fringe($b) }</lang>
sub samefringe ($a, $b) { fringe($a) eqv fringe($b) }</lang>
Testing:
Testing: