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))
我编写了适用于我测试过的所有实现的 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))