Command line 在racket中启动子进程

Command line 在racket中启动子进程,command-line,scheme,racket,Command Line,Scheme,Racket,我希望从Dr Racket内或从命令行启动n个子进程(即,我希望完全在Dr Racket ide内或完全从命令行运行代码) 然后,这些进程将通过stdin和stdout交换消息 通过修改以下代码(从cmd行开始)是否可以实现这一点?(或者可能吗?请注意,我是一个方案初学者) 不确定这是否是您想要的,但是当前命令行参数是一个参数,因此您可以使用参数化设置它 下面是对代码的修改,它生成当前目录中的文件: #lang racket (struct proc (stdout stdin)) (defi

我希望从Dr Racket内或从命令行启动n个子进程(即,我希望完全在Dr Racket ide内或完全从命令行运行代码)

然后,这些进程将通过stdin和stdout交换消息

通过修改以下代码(从cmd行开始)是否可以实现这一点?(或者可能吗?请注意,我是一个方案初学者)


不确定这是否是您想要的,但是
当前命令行参数
是一个参数,因此您可以使用
参数化设置它

下面是对代码的修改,它生成当前目录中的文件:

#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))))))

顺便说一句,DrRacket只是IDE的名称。球拍是语言的名称。

虽然直观,但我怀疑事情是否能像这样运作;编辑:假设你的制作人工作过,你的消费代码在哪里?是的,它是从命令行工作的(我测试过)。确实非常整洁。我添加了代码来读取和写入子流程,所以如果它工作,问题是什么D或者你现在找到解决办法了吗?(如果是这样,请将其作为答案发布以供将来参考)问题是我如何从Dr racket内部(而不仅仅是从命令行)执行相同的操作。也就是说,代码是从命令行工作的,而不是从Dr Racket内部工作的。
#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))))))