Tree datastructures: Difference between revisions

→‎{{header|Perl 6}}: Break out import into a reusable routine, better escaping of meta characters, better variable names
m (→‎{{header|zkl}}: remove redundant code)
(→‎{{header|Perl 6}}: Break out import into a reusable routine, better escaping of meta characters, better variable names)
Line 172:
my $level = ' ';
 
my $treetrees = q:to/END/;
RosettaCode
encourages
Line 189:
END
 
sub nested-to-indent { $^str.subst: / ^^ ($($level))* /, -> $/ { "{+$0} " }, :g }
sub indent-to-nested { $^str.subst: / ^^ (\d+) \s* /, -> $/ { "{$level x +$0}" }, :g }
 
say $treetrees;
say my $indent = $treetrees.&nested-to-indent;
say my $nest = $indent.&indent-to-nested;
 
use Test;
is($treetrees, $nest, 'Round-trip equals original');
 
#`(
Line 205:
)
 
# Import outline paragraph into native data structure
my @forest = $tree.comb( /^^\S.+? <?before $ | ^^\S>/);
sub import (Str $trees, $level = ' ') {
my $forest;
{
my $last = -1Inf;
 
for @forest$trees.lines -> $treebranch {
for $tree.linesbranch ->~~ / ($($linelevel))* {/;
my $linethis ~~= /^^ (+$($level))* /0;
$forest ~= do my $this;{
given $forestthis ~=cmp do$last {
givenwhen ($thisMore ={ "\['{esc +$0)branch.trim}', cmp" $last {}
when MoreSame { "\['{esc $linebranch.trim}', " }
when Less { "{']' whenx Same$last {- $this}, "'{esc $linebranch.trim}', " }
when Less { "{']' x $last - $this}, '{$line.trim}', " }
}
}
$last = $this;
}
$last = }$this;
}
 
sub esc { $^s.subst( /(<['\\]>)/, -> $/ { "\\$0" }, :g) }
 
$forest ~= ']' x 1 + $last;
use MONKEY-SEE-NO-EVAL;
$forest.=EVAL;
}
 
my $forest = import $trees;
 
say "\nNative data structure:\n", $forest.perl;
10,333

edits