Scheme 中的 Scheme REPL 在用户按回车键时不呈现提示

Scheme REPL in Scheme don't render prompt when user press enter

我编写了适用于我测试过的所有实现的 Scheme REPL,但是当有人按下 enter 键但没有输入任何内容时出现问题。

(define void (if #f #f))

(cond-expand
  (lips)
  (kawa)
  (gambit)
  (guile (define (flush-output-port) void))
  (gauche (define (flush-output-port) (flush (current-output-port)))))

(let ((repl (lambda ()
              (let ((env (interaction-environment)))
                (let iter ()
                  (display "scheme> ")
                  (flush-output-port)
                  (let ((input (read)))
                     (if (eof-object? input)
                         (newline)
                         (let ((result (eval input env)))
                           (if (not (eq? result void))
                               (begin
                                 (display result)
                                 (newline)))
                           (iter)))))))))
  (repl))

如何修复我的 REPL,使其在有人输入时按预期工作,当用户尝试使用 CTRL+D 退出 REPL 时它也应该工作。现在当您输入空输入时它不会打印提示。

注意:有人告诉我,我的 void 可能不会在每个实现中都起作用,但即使是 SRFI 也使用它(我在 Sketchy Scheme book 中了解到了这一点)。

我能够修复我的 REPL:

(let ((repl (lambda ()
              (let ((env (interaction-environment)))
                (let iter ()
                  (display "scheme> ")
                  (flush-output-port)
                  (if (char=? (peek-char) #\newline)
                      (begin
                         (read-char)
                         (iter)))
                  (let ((input (read)))
                     (if (eof-object? input)
                         (newline)
                         (let ((result (eval input env)))
                           (if (not (eq? result void))
                               (begin
                                 (display result)
                                 (newline)))
                            (if (and (char-ready?) (char=? (peek-char) #\newline))
                                (read-char))
                            (iter)))))))))
  (repl))