You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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")

其他需要修复的问题

  1. 括号匹配错误:原代码中if分支的括号位置混乱,导致程序逻辑断裂,需确保每个begin和条件语句的括号正确闭合。
  2. 条件语句逻辑混乱:多层if嵌套写法错误,改用cond语句让多条件判断更清晰易维护。
  3. 提示信息逻辑错误:原代码中猜测值小于目标时提示"Lower...",实际应该提示用户猜更大的数,反之亦然,修正后提示更明确。
  4. 无效冗余代码:原代码末尾的(+ (random 99) 1) 1)无意义,直接删除;若需要游戏结束后重新开始,可调用(guess-game (+ (random 100) 1) 5)。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:52:47