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

Scheme新手如何实现接收用户输入并将内容添加到列表的功能

代码问题梳理
  • 变量作用域错误:未定义过lst变量,也没有将已收集的列表作为参数在递归调用中传递,程序无法存储之前输入的内容。
  • 形参重定义冲突:函数定义的形参是number,函数内部又用define重新定义了同名变量,逻辑冲突;且read-line读取到的内容默认是字符串类型,直接用number?判断永远返回假,不会进入收集逻辑。
  • cond语法错误:Scheme中cond的每个分支应为(条件 执行语句)结构,当前代码中(number? number)后面没有对应执行块,结构完全不符合语法要求。
  • 函数调用与参数顺序错误:(cons lst (number))中将number误作为函数调用,同时cons的参数顺序写反,正确结构应为(cons 新元素 已有列表)。
  • 流程逻辑缺失:没有递归调用逻辑,仅读取一次输入就会结束,无法收集多个输入内容。
  • 终止判断逻辑错误:未做输入值和"e"的匹配判断,终止条件不符合需求。
修正后的可运行实现
(display "Continue to enter numbers until satisfied then enter e to end")
(newline)
; 定义递归函数,参数lst用来存储已经收集到的数字列表
(define (intlist lst)
  (let ((input (read-line))) ; 读取用户输入存入input变量
    (cond
      ; 如果输入是"e",终止并输出结果
      ((string=? input "e")
       (display "收集到的数字列表:")
       (display lst)
       (newline))
      ; 否则尝试把输入转成数字
      (else
       (let ((num (string->number input)))
         (if (number? num)
             ; 是数字就把数字加入列表,递归调用继续读取
             (intlist (cons num lst))
             ; 不是数字也不是e,提示输入错误,递归继续
             (begin
               (display "输入无效,请输入数字或者e结束")
               (newline)
               (intlist lst))))))))
; 初始调用,传入空列表作为初始存储
(intlist '())
学习方向指引
  • 先掌握Scheme的基础语法规则:包括cond、if等条件表达式的正确写法,变量定义、作用域的规则,递归的基本实现逻辑。
  • 熟悉常用基础函数的用法:cons、string->number、string=?等常用函数的参数顺序、返回值特性。
  • 理解纯函数式编程的核心逻辑:Scheme是函数式语言,无可变变量的场景下,通过递归传递参数的方式保存状态,不要套用命令式语言的可变变量思路编写代码。

内容的提问来源于stack exchange,提问作者Driagis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:48:02