2016-02-26 3 views
3

Я хотел бы запустить n подпроцессов из Dr Racket или из командной строки (то есть я хотел бы запустить код либо полностью в стиле Dr Racket, либо целиком из командной строки).Запуск подпроцессов в ракетке

Эти процессы затем будут обмениваться сообщениями через stdin и stdout.

Возможно ли это, изменив следующий код, который запускает их из строки cmd? (Или это вообще возможно? Обратите внимание, что я новичок схема)

(struct proc (stdout stdin)) 

(define (start-program p) 
    (define-values (s stdout stdin stderr) (subprocess #f #f #f p)) 
    (thread (lambda() (copy-port stderr (current-error-port)))) 
    (proc stdout stdin)) 

(define programs (vector->list (current-command-line-arguments))) 

(map start-program programs) 

(define (send-to proc v) 
    (write v (proc-stdin proc)) 
    (flush-output (proc-stdin proc))) 

(define (receive-from proc) 
    (read (proc-stdout proc))) 
+0

Хотя я интуитивно понятен, я сомневаюсь, что все работает так: p (если это действительно так, WOW!) Изменить: скажите, что ваш продюсер работал, где ваш потребительский код? – leppie

+0

Да, это работает из командной строки (я ее протестировал). Очень аккуратно. – user35202

+0

Я добавил код для чтения и записи в подпроцесс – user35202

ответ

1

Не уверен, если это то, что вы после этого, но current-command-line-arguments является параметром, так что вы можете установить его с parameterize.

Вот адаптация кода, который производит файлы в текущем каталоге:

#lang racket 
(struct proc (stdout stdin)) 

(define (start-program p) 
    (define-values (s stdout stdin stderr) (subprocess #f #f #f p)) 
    (thread (lambda() (copy-port stderr (current-error-port)))) 
    (proc stdout stdin)) 

(define (send-to proc v) 
    (write v (proc-stdin proc)) 
    (flush-output (proc-stdin proc))) 

(define (receive-from proc) 
    (read (proc-stdout proc))) 

(parameterize ([current-command-line-arguments (vector "ls")]) 
    (define programs 
    (map find-executable-path (vector->list (current-command-line-arguments)))) 
    (define running-programs 
    (map start-program programs)) 
    (let loop ([x (receive-from (first running-programs))]) 
    (displayln x) 
    (unless (eof-object? x) 
     (loop (receive-from (first running-programs)))))) 

Btw, DrRacket только название IDE. Racket - это название языка.

Смежные вопросы