Guest User

Untitled

a guest
Sep 26th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.81 KB | None | 0 0
  1. use strict;
  2. use warnings;
  3.  
  4. package Node {
  5. use Class::Accessor::Lite ro => [qw/value children/], new => 1;
  6. }
  7.  
  8. # DSL
  9. package main {
  10. sub node ($;&) { goto \&_node }
  11. sub _node {
  12. my ($value, $code) = @_;
  13.  
  14. my @children;
  15. if ($code) {
  16. my $node_sub = sub ($;&) { push @children => _node(@_) };
  17.  
  18. no warnings qw/redefine/;
  19. local *node = $node_sub;
  20. use warnings qw/redefine/;
  21.  
  22. $code->();
  23. }
  24.  
  25. return Node->new(value => $value, children => \@children);
  26. }
  27. };
  28.  
  29. my $tree = node 1, sub {
  30. node 2, sub {
  31. node 3, sub {
  32. node 4;
  33. node 5;
  34. };
  35. node 6;
  36. };
  37. node 7;
  38. node 8, sub {
  39. node 9, sub {
  40. node 10;
  41. node 11;
  42. };
  43. node 12;
  44. };
  45. };
Add Comment
Please, Sign In to add comment