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