scheme - 当用户按 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中了解了这一点)。
解决方案
我能够修复我的 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))
推荐阅读
- excel - VBA根据excel条件从两个word文档中复制文本
- android - AccessibilityService中的Android onAccessibilityEvent没有被调用
- youtube-iframe-api - Youtube IFrame API 有时不会触发 `onError` 事件
- git - git中两次提交之间的变化
- android - react-native 项目构建失败
- java - 在 RowMapper 中自动装配 Objectmapper
- javascript - 从另一个 GPS 位置 + 距离计算位置
- python - 如何从平面列表中制作嵌套列表?
- unity3d - TextMesh Pro 与 LWRP 不兼容
- android-studio - Flutter:obscureText,参数未定义