[STDeco] Run builds of required submodules in the same process. No more $^X hacks...
[pugs.git] / misc / kp6-repl.pl
blobb293ad4eb41a63df69aa1b8b0558de7f86552203
1 package RenameMe; #XXX
3 BEGIN {
4 chomp(my $lib = `kp6 -lib`);
5 eval("use lib '$lib';");
7 use KindaPerl6::Runtime::Perl5::Runtime;
8 use File::Temp 'tmpnam';
9 use Scriptalicious 1.05;
10 use strict;
12 sub call_kp6 {
13 my($input,$args)=@_;
14 my $tmpfn = tmpnam();
15 open(F,"|kp6 $args > $tmpfn") or die;
16 print F $input;
17 close(F);
18 my $output = `cat $tmpfn`;
19 unlink($tmpfn);
20 return $output;
23 sub print_repl_help {
24 print ":h show this help\n";
25 print ":q quit\n";
26 print ":v toggles verbose output\n";
27 print ":5 <p5code> run perl5 code\n";
28 print " <p6code> run perl6 code\n";
29 print ":l <filename> run perl6 file\n";
32 # Design issue [Getting-Expression-Value]
33 # kp6 currently generates p5 code which always evaluates to 1.
34 # So how should we print the value of the user's expression?
35 # One can wrap simple expressions in "say". "say 3;".
36 # But kp6 doesn't currently understand "{;3}" as a way of
37 # wrapping expressions without altering scope.
38 # And wrapping a function and calling it seems likely to
39 # cause trouble (eg, "sub wrap(){ 3 } say wrap();").
40 # For now, fudge.
42 # Design issue [Perserving-Variables]
43 # kp6 currently uses our() variables, so they are lost at the
44 # end of the eval(), and unavailable for subsequent user input.
45 # For now, accumulate all non-error causing p6, and eval the
46 # entire accumulation.
47 # We can't accumulate p5 instead of p6, because compilation
48 # requires knowing previous declarations.
49 # So the accumulated p6 keeps getting bigger. :( XXX
51 my $accumulated_p6; # See [Perserving-Variables].
52 sub run_repl {
53 my $verbose = 0;
54 my $eval_p5 = sub {
55 my($p5)=@_;
56 my @result = eval($p5);
57 print $@ if $@;
58 # @result is always [1]. See [Getting-Expression-Value].
59 #print "",(map{defined $_ ? $_ : 'undef'}@result),"\n";
61 my $eval_p6 = sub {
62 my($p6)=@_;
63 my $code = $p6;
65 # XXX Wrap one-liners in say(). See [Getting-Expression-Value].
66 $code = "say $code;" if $code =~ tr/\n/\n/ <= 1;
68 # XXX See [Perserving-Variables].
69 $code = $accumulated_p6 ."\n". $code;
70 my $new_accumulation = $accumulated_p6 ."\n". $p6;
72 my $p5 = call_kp6($code,'');
73 if($verbose) {
74 print call_kp6($p6,'-ast | perltidy');
75 print "# p5\n",number_the_lines($p5),"\n";
77 print "----\n";
78 $eval_p5->($p5);
80 $accumulated_p6 = $new_accumulation if !$@;
82 print_repl_help();
83 while (1) {
84 my $line = prompt_string("p5ugs> ");
85 last if !defined $line;
86 if ($line =~ /\A:h\s*\Z/) { print_repl_help(); next;}
87 if ($line =~ /\A:q\s*\Z/) { exit(0);}
88 if ($line =~ /\A:v\s*\Z/) { $verbose = !$verbose; next;}
89 if ($line =~ /\A:5\s+(.+)/) {
90 $eval_p5->($1);
91 next;
93 if ($line =~ /\A:l\s+(\S+)/) {
94 my $filename = $1;
95 my $p6 = `cat $filename`;
96 $eval_p6->($p6);
97 next;
99 $eval_p6->($line);
103 sub number_the_lines {
104 my($s)=@_;
105 my $cnt = 1;
106 $s =~ s/^/$cnt++."\t"/mge;
110 #XXX remove me
111 run_repl();
114 __END__