问题描述
我已经编写了适用于我测试过的所有实现的 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,使其在有人输入 enter 时按预期工作,当用户尝试使用 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))