-while (!defined $vals{root}) {
- for my $n (keys %names) {
- next if defined $vals{$n};
- my $e = $names{$n};
- my $d = 1;
- for my $v (keys %vals) {
- $e =~ s/$v/$vals{$v}/g;
- }
- next if $e =~ /[a-z]/;
- say "eval $e";
- eval "\$vals{$n} = $e";
- say "set \$vals{$n} to $vals{$n}" unless $@;
+sub walk($var) {
+ return $val{$var} if defined $val{$var};
+ my ($arg1, $op, $arg2) = @{ $expr{$var} };
+ if ($op eq '+') {
+ return $val{$var} = walk($arg1) + walk($arg2);
+ } elsif ($op eq '-') {
+ return $val{$var} = walk($arg1) - walk($arg2);
+ } elsif ($op eq '*') {
+ return $val{$var} = walk($arg1) * walk($arg2);
+ } elsif ($op eq '/') {
+ return $val{$var} = walk($arg1) / walk($arg2);