--- /dev/null
+#!/usr/bin/env perl
+
+use strictures 1;
+use IPC::Open2;
+use Term::ReadLine;
+use JSON::PP qw(encode_json decode_json);
+
+my $cmd = do {
+ if (my $host = $ARGV[0]) {
+ 'cat jsonrepl.packed - | ssh '.$host.' perl -'
+ } else {
+ 'perl jsonrepl'
+ }
+};
+
+my $pid = open2(my $out, my $in, $cmd);
+
+my $read = Term::ReadLine->new('REPL');
+
+while (1) {
+ my $line = $read->readline('re.pl$ ');
+ exit unless defined $line;
+ next unless length $line;
+ print $in encode_json([ EVAL => $line ])."\n";
+ my $reply = decode_json scalar readline($out);
+ if ($reply->[0] eq 'MISTAKE') {
+ die "Botch: ".join(': ', @{$reply}[1,2]);
+ }
+ my $ret = $reply->[1];
+ print $ret->{return};
+ if ($ret->{stdout}) {
+ chomp($ret->{stdout});
+ print "STDOUT:\n${\$ret->{stdout}}\n";
+ }
+ if ($ret->{stderr}) {
+ chomp($ret->{stderr});
+ print "STDERR:\n${\$ret->{stderr}}\n";
+ }
+}