首页 > 解决方案 > 当用户按 Enter 时,Scheme 中的 Scheme REPL 不呈现提示

问题描述

我已经编写了适用于我测试过的所有实现的 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中了解了这一点)。

标签: schemeread-eval-print-loop

解决方案


我能够修复我的 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))

推荐阅读