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
相关产品推荐
相关产品推荐

