如何解决Scheme中‘read-line: undefined; 无法引用未定义标识符’错误
Scheme猜数字游戏:修复
read-line未定义及其他错误 核心问题:read-line未定义
R5RS标准Scheme没有内置read-line和flush-output函数,在DrRacket中运行时需要导入Racket的基础模块来获取这些功能。在代码开头添加以下引用:
#%require racket/base
保留原有的srfi-27引用用于随机数生成:
#%require (lib "27.ss" "srfi")
其他需要修复的问题
- 括号匹配错误:原代码中
if分支的括号位置混乱,导致程序逻辑断裂,需确保每个begin和条件语句的括号正确闭合。 - 条件语句逻辑混乱:多层
if嵌套写法错误,改用cond语句让多条件判断更清晰易维护。 - 提示信息逻辑错误:原代码中猜测值小于目标时提示"Lower...",实际应该提示用户猜更大的数,反之亦然,修正后提示更明确。
- 无效冗余代码:原代码末尾的
(+ (random 99) 1) 1)无意义,直接删除;若需要游戏结束后重新开始,可调用(guess-game (+ (random 100) 1) 5)。 - 猜测次数显示错误:原代码显示总尝试次数,改为显示用户实际使用的次数
(- attempts attempts-left)。
修复后的完整代码
#%require racket/base #%require (lib "27.ss" "srfi") (define (guess-game target attempts) (display "Guess a number from 1 to 100:") (newline) (let loop ((attempts-left attempts) (low 1) (high 100)) (cond ((= attempts-left 0) (begin (display "Out of attempts. The correct number was ") (display target) (newline) (display "Please enter your name:") (newline) (let ((name (read-line))) (display "Good game, ") (display name) (newline) (newline)))) (else (begin (display "Enter guess: ") (flush-output) (let ((guess (string->number (read-line)))) (cond ((not (integer? guess)) (begin (display "Invalid input. Please enter a valid integer.") (newline) (loop attempts-left low high))) ((= guess target) (begin (display "Correct! You used ") (display (- attempts attempts-left)) (display " guesses. Please enter your name:") (newline) (let ((name (read-line))) (display "Good game, ") (display name) (newline) (newline)))) ((< guess target) (begin (display "Too low! Guess higher.") (newline) (loop (- attempts-left 1) guess high))) (else (begin (display "Too high! Guess lower.") (newline) (loop (- attempts-left 1) low guess)))))))))) ; 启动游戏,随机生成1-100的目标数 (guess-game (+ (random 100) 1) 5)
额外说明
- 导入
racket/base后,read-line和flush-output就能正常工作,解决了运行时的未定义错误。 - 使用
cond替代多层if,让代码逻辑更直观,后续修改也更方便。 - 修正后的提示信息能正确引导用户调整猜测方向。
- 随机生成目标数让游戏每次运行都有不同的体验,也可以改回固定值
100。
内容的提问来源于stack exchange,提问作者Michael Ferguson
相关产品推荐
相关产品推荐

