球拍中的子过程



我正在编写一个程序,该程序需要在进程之间进行通信。

我的代码:

#lang racket
(define-values (sp o i e) (subprocess #f #f #f "c://player1.exe" ))
(define count 10)
(for ([c (in-naturals)])
  (cond
    [(equal? count 0) (error "Province is empty!") ] 
    [else 
     (write "server" i)
     (set! count (sub1 count))
     (flush-output i)
     (display (read o))]))

和player1.exe代码:

#lang racket
(define (interact notification)
  (cond
    [(eq? notification "server") (write "true" (current-output-port))]
    [else (write "false" (current-output-port))]))
(for ([c (in-naturals)])
  (interact (read (current-input-port)))
  (write "player" (current-output-port))
  (sleep 0.1)
  flush-output (current-output-port))

如果我在没有循环的情况下运行,我会得到输出。当只有玩家在发送信息时,我也会得到输出。但由于服务器和播放器都发送消息,程序被挂起。你认为问题出在哪里?

player1.exe文件中的最后一行看起来可疑。CCD_ 2实际上并不是作为一个函数来应用的。而不是

flush-output (current-output-port)

你可能是说:

(flush-output (current-output-port))

从样式的角度来看:默认情况下,函数readwriteflush-output都在当前的输入和输出端口上工作,因此不需要提供它们。看看这些函数的文档,比如flush-output,你会发现它提到current-output-port是它的默认值。

所以我们刚才看到的行可以写成:

(flush-output)

更多问题:不要使用eq?来比较字符串。请改用string=?。原因是可能有两个字符串具有相同的文本内容,但eq?仍然能够区分这两个字符串。例如:

kui $ racket
Welcome to Racket v5.2.1.
> (eq? "a" (string-copy "a"))
#f
> (string=? "a" (string-copy "a"))
#t

最新更新