> -----Original Message-----
> From: Larry Wall [mailto:[EMAIL PROTECTED]
>
> On Tue, Apr 20, 2004 at 03:53:31PM -0400, Aaron Sherman wrote:
> : In specific, here is a proposal for execution:
> :
> :     multi run(string $command) returns(Process) {...} # Funky shell default
> :     multi run(Process $process) returns(Process) {...} # Relies on
$process.cmdline
>
> Eh?  What does it mean to run a process that presumably is
> already running?

  use strings :LC_CTYPE('x-en-US-gnu');

  my $shell = new Process('/bin/bash');
  my $ide = $shell->run('/usr/bin/emacs');

  $ide->run('\M-xperl6-interactive\n');
  $ide->run(<<-'END_PERL');
        use Hash::halfdan;

        %hash`access`tricks++;
  END_PERL

  $ide->run('\M-xkill-interactive\n');
  $ide->run('\C-x\C-z');

  $ide->wait(3);
  $ide->kill('USR1')
        unless $ide->done;

  $shell->kill('HUP');

>
> :     multi run(Program $program, IO::Mode $mode=undef)
> returns(Process) {...}
> :
> : which gives us our process control, all nicely bottled up:
> :
> :     my Process $p = run("find / -name null");
> :     say "Spawned find $($p.getpid)";
> :     $p.kill('TERM');
> :
> : But if you don't want that, you can always:
> :
> :     run("find / -name null").wait;
> :
> : which might have an alias called "system".
>
> I'm trying to avoid "system" actually, since it's backwards on its
> booleanness in Perl 5, and it would be confusing to just swap it.

Let's use unary backtick as a cheap qx for "atomic" commands.

It's twice as ergonomic as the current implementation. :-) :-) :-)

>
> : And if you provide mode:
> :
> :     my Process $p = run(program=>"find / -name null", mode=>"r");
> :
> : Then you actually get back a:
> :
> :     class ExecPipe is Process does IO::Handle {...}
> :
> : which lets you do:
> :
> :     say "Found null at: $p.getline";
> :
> : and which could have a wrapper:
> :
> :     $x = readpipe("pwd");
> :
> : ahhh... simple.
>
> Er, yeah...
>
> : open2, open3, exec and all manner of other strange things should be
> : simple aliases for complex run invocations.
>
> The complicated interface should have a longer name name "run".  I was
> thinking run was the new name of "system", and possibly is
> context sensitive on its I/O redirection.

'execute'?

> : The reason for making Program an object? Why for this:
> :
> :     run(Program(path=>"find",name=>"finding null",args=>[<</
> -name null>>],exec=>true));
> :
> : which has the alias "exec".

I confess I don't understand what value making Program an object has in this
context. If you're going to exec, in the unix sense, then creating a Program
with exec=>true cannot do anything except "get ready" for the run/exec call.
To my feeble mind, there's not much benefit there, unless you figure that
exec+run will catch some class of resource exhaustion error sooner?

> I kinda cringe to see exec=>true when we just defined :exec to
> mean that...

When 'exec' is buried at the end of a hideously complex arglist, as in this
example, I'll take all the verbosity I can get. It helps my parser resync.

  run(Program :path<find> :name<finding null> :args[</ -name null>] :exec)

That does read better with a little sorting, and of course a method:

  Program
        :name<finding null> :exec
        :path<find> :args[</ -name null>]
  ==> run;

Which brings up pipelining operators:

  class Program {...}
  multi *infix:<(Program $p, String^IO::Handle $input) { $p.input =
$input; };
  multi *infix:>(Program $p, String^IO::Handle $output) { $p.output =
$output; };
  multi *infix:|(Program $p, Program $q) { $p.output = '|$q'; }
  multi *postfix:!(Program $p) is tighter(&infix:and) { $p.run;}

  Program
        :name<finding null>
        :path<find> :args</ -name null -ls>
  | Program
        :name<sorting by size>
        :path<sort> :args<-k6d>
  > File
        :name<nulls.txt>
        :mode<overwrite>
  !;

Self-documenting shell scripts? The id recoils in disgust.

> : Making this as magical as Perl 5 system would be difficult, though, and
> : I'm not sure you need to preserve that particular way of doing things.
>
> Not sure which magic you're referring to.  system() is pretty stupid,
> other than a little optimization to bypass the shell when it can.

We've got operator overloading and macros. We can make C++ look like COBOL
by comparison.

Whether we want to do so is another question.

>
> : I leave the definition of Program up to the imagination of the reader.
>
> Oh, oh...
>
> : Incidentally, if Process is a standard class, and happens to do:
> :
> :     class Process {
> :             ...
> :             method prefix:~() { return ~($.getpid) }
> :             method prefix:+() { return $.getpid }
> :             ...
> :     }
> :
> : Then $$ is just a Process object, but behaves exactly as you always
> : expected it to.

Beware of expecting too much *n*x in there. prefix:~() should return the
GUID.

;-)

> :
> :     $$.kill("ABRT")
> :
> : then does what you might expect, as does:
> :
> :     say $$.cmdline;
>
> Okay, but there is no $$ anymore.  It'd be $*PID or $*PROC or some such.

'is' this, 'does' that. What ever happened to line-noise?

=Austin

Reply via email to