[gambit-list] Bashing in scheme?

David St-Hilaire sthilaid at iro.umontreal.ca
Wed Apr 23 13:15:57 EDT 2008


Thank you! That is exactly what I was looking for!

David

Marc Feeley wrote:
> On 23-Apr-08, at 11:26 AM, David St-Hilaire wrote:
> 
>> Hello all!
>>
>> I'd like a little help with some bash style scripting that I would 
>> like to do in
>> my gambit repl.
>>
>> How can I do in scheme what I would do in bash like f1 < input-file | 
>> f2, where
>> f1 and f2 are 2 scheme functions reading and writing to stdin and stdout
>> respectively.
>>
>> I know that the < input-file part is done with
>> (with-input-from-file input-file (lambda () f1)
>> put it is the pipe part that remains obscur to me...
> 
> 
> You don't need to create files, or execute shell commands.  It can all 
> be done within Gambit using threads and "pipe" string ports:
> 
> (define (producer)
>   (for-each (lambda (x)
>               (thread-sleep! 0.5) ;; simulate heavy computation
>               (pretty-print (* x x x))
>               (force-output))
>             '(1 2 3))
>   (if (not (tty? (current-output-port)))
>       (close-output-port (current-output-port))))
> 
> (define (consumer)
>   (let loop ()
>     (let ((x (read)))
>       (if (not (eof-object? x))
>           (begin
>             (pretty-print (sqrt x))
>             (force-output)
>             (loop)))))
>   (if (not (tty? (current-output-port)))
>       (close-output-port (current-output-port))))
> 
> (define (pipe p c)
>   (receive (out in) (open-string-pipe '(direction: output))
>     (let ((t
>            (thread-start!
>             (make-thread
>              (lambda ()
>                (with-output-to-port out p))))))
>       (with-input-from-port in c))))
> 
> (display "------------------------\n")
> 
> ;; try it with producer outputting to console
> (producer)
> 
> (display "------------------------\n")
> 
> ;; now, pipe producer's output to consumer's input
> (pipe producer consumer)
> 
> (display "------------------------\n")
> 
> ;; a more complex pipe...
> (pipe (lambda () (pipe producer consumer)) consumer)




More information about the Gambit-list mailing list