add dump command to shell to start enabling debugging
[scpubgit/DKit.git] / bin / dx-shell
index e7b1b58..6848ed6 100644 (file)
@@ -5,6 +5,8 @@ use curry;
 use DX::Solver;
 use DX::Lib::FS;
 use Term::ReadLine;
+use Devel::Dwarn;
+use Sub::Quote;
 
 my $solver = DX::Solver->new(observation_policy => sub { 1 });
 
@@ -31,12 +33,22 @@ sub do_query {
   } @res ]);
 }
 
-$tcl->CreateCommand(query => sub {
-  my (undef, undef, undef, $vars, $body) = @_;
+sub expand_def {
+  my ($vars, $body) = @_;
   my @varnames = $split->($vars);
+  return (\@varnames, expand_body($body));
+}
+
+sub expand_body {
+  my ($body) = @_;
   local our @Body_Parts;
   $tcl->Eval($body);
-  @last_q = (\@varnames, @Body_Parts);
+  return @Body_Parts;
+}
+
+$tcl->CreateCommand(query => sub {
+  my (undef, undef, undef, $vars, $body) = @_;
+  @last_q = expand_def($vars, $body);
   do_query();
   return;
 });
@@ -51,6 +63,12 @@ $tcl->CreateCommand(run => sub {
   return;
 });
 
+$tcl->CreateCommand(dump => sub {
+  my (undef, undef, undef, $to_dump) = @_;
+  my $filter = quote_sub($to_dump);
+  Dwarn(map $filter->($_), @res);
+});
+
 sub mangle_args {
   my @args = @_;
   map { $_ =~ /^'(.*)'$/ ? \do { my $x = $1 } : $_ } @args;
@@ -62,21 +80,48 @@ my $rule_sub = sub {
   return;
 };
 
+$tcl->CreateCommand(rule => sub {
+  my (undef, undef, undef, $rule, $vars, $body) = @_;
+  $solver->add_rule($rule => expand_def($vars, $body));
+  $tcl->CreateCommand($rule => $rule_sub);
+  return;
+});
+
 foreach my $rule (keys %{$solver->rule_set->rules}) {
   $rule =~ s/\/\d+$//;
   $tcl->CreateCommand($rule => $rule_sub);
 }
+
+$tcl->CreateCommand(exists => sub {
+  my (undef, undef, undef, $vars, $body) = @_;
+  push our @Body_Parts, [ exists => expand_def($vars, $body) ];
+  return;
+});
+
+$tcl->CreateCommand(foreach => sub {
+  my (undef, undef, undef, $var, $body, $each_body) = @_;
+  push our @Body_Parts, [
+    foreach => $var => map [ expand_body($_) ], $body, $each_body
+  ];
+  return;
+});
   
 #$tcl->Eval(q{query D {directory_at D 't'; mode D '0755'; }});
 
+if ($ARGV[0]) {
+  $tcl->EvalFile($ARGV[0]);
+}
+
 my $rl = Term::ReadLine->new;
 
 my $cmd;
 
-while (defined(my $line = $rl->readline(length($cmd)?'+ ':'$ '))) {
-  $cmd .= $line;
+while (defined(my $line = $rl->readline(length($cmd)?'> ':'$ '))) {
+  $cmd .= "${line}\n";
   if ($tcl->call(info => complete => $cmd)) {
-    $tcl->Eval($cmd);
+    unless (eval { $tcl->Eval($cmd); 1 }) {
+      warn $@;
+    }
     $cmd = '';
   }
 }