подпроцесс в ракетке - PullRequest
       9

подпроцесс в ракетке

1 голос
/ 12 февраля 2012

Я пишу программу, которая требует связи между процессами.

мой код:

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

Я получаю вывод, если я бегу без циклов. Я также получаю вывод, когда только игрок отправляет сообщения. Но когда сервер и игрок отправляют сообщения, программа зависает. Как вы думаете, в чем проблема?

1 Ответ

4 голосов
/ 12 февраля 2012

Последняя строка в вашем 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? все равно сможет различить две. e.g.:

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