[英]subprocess in racket
我正在編寫一個需要流程之間進行通信的程序。
#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))]))
#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
文件的最后一行看起來可疑。 實際未將flush-output
用作函數。 而不是
flush-output (current-output-port)
您可能是說:
(flush-output (current-output-port))
從樣式的角度來看:默認情況下,函數read
, write
和flush-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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.