use v6-alpha;
# Todo list:
# - There must be a cleaner way of presenting .perl without a leading \.
# - Need to implement :{e,E,d,D,h,r,l}.
sub quit () {
say "Leaving interactive shell...";
exit(0);
}
# We'd like to not pollute the eval's environment with our vars ($line, etc.).
sub clean_eval ($___str) { eval $___str }
say "Welcome to Pugs -- $?PUGS_VERSION";
say "Type :h for help.";
loop (;;) {
# XXX use :prompt
#my $line = =$*IN :prompt('pugs> ');
print "pugs> ";
my $line = =$*IN;
# Quit and EOF.
quit() unless defined $line;
# Skip empty lines.
next if $line eq "";
given ($line) {
when rx:P5/^\:(.)/ {
given ($0) {
when "e" {
# XXX
}
when "E" {
# XXX
}
when "d" {
# XXX
}
when "D" {
# XXX
}
when "q" {
quit();
}
when "h" {
# XXX
}
when "r" {
# XXX
}
when "l" {
# XXX
}
}
}
default {
# We need to .perl the result right here to make prettyprinting of
# junctions work.
my $ret = clean_eval $line;
say chomp $! and next if $!;
# We've to .perl in a second pass (and in a try {...} block) to
# catch "fail_"s.
$ret = try { $ret.perl };
say chomp $! and next if $!;
say substr($ret, 0, 1) eq "\\" ?? substr($ret, 1) !! $ret; # XXX NASTY HACK
#" #--vim
}
}
}
quit();
=head1 NAME
eval.pl - simple read-eval-print loop implementation
=head1 DESCRIPTION
This simplistic program will keep reading from standard input and evaluating whatever is
typed.