pipe operator

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

pipe operator

Ralph Boland
I like the idea of a pipe operator just like I like the ';' operator.
They are both (and independently) useful.
However, I object to using the '|' symbol for this. 
(How about using  '::' or  ':-:'  instead?)

I think the '|' operator should be used to plug output streams into input streams
just as it is used between processes in linux shells.

To use such an operator we first we need objects
that (in the most general case)
read data from an input stream, process the stream,
and then output the result to an output stream. 
Let  b1, b2, b3  be three such objects,  'in'  be an input stream,
and 'out' be an output stream.
Then we could write:

b1 < in; > out.  

to have  b1 read its input from 'in' and put its result into  'out'.
Note that 'b1 < in'  cannot generate any output since b1 does not yet know
where to send it.  After the  '; > out.'  b1 can process its input and put its
output into 'out'.

Now we can write:

b1 < in; | b2 | b3 > out.

which has
b1 read its input from 'in', process its input, and send its output to  b2,
b2 process its input (the output of b1) and send its output to b3,  and
b3 process its input (the output of b2) and put its output into 'out'.

To have this work well there would need to be objects called pipes
that do most of the data moving between  b1, b2, b3.
Thus the method   '|'  would look something like:

| b
pipe := Pipe output: b.
self > pipe.

Perhaps things would not work exactly as I have described
but you get the idea.
Suggestions as to better syntax welcome.

Notes:
1)  No change to Squeak or any other version of Smalltalk is needed.
     (unless we want cleaner syntax);
     we only need to implement this feature. 
     Anybody want to write a pipes package?
     Given how useful pipes are in linux shells,
     it surprises me that a pipes package hasn't been written before.
2)  Some collection classes could be made to act like streams with regard to pipes;
     we just need to implement the necessary methods.
3)  Class Pipe could have subclasses each of which would have different internal
      implementations for efficiency reasons.

Ralph Boland