如何在Scheme中实现简单列表迭代器并解决自定义迭代函数报错问题
错误原因
你存在两处核心问题导致报错和功能不完整:
- 第一处是括号使用不符合Scheme语法规则:Scheme中括号具有执行语义,将表达式用括号包裹代表「把第一个元素作为函数调用,后续所有元素作为入参执行」:
- 递归调用
iterate时你多套了一层括号,写为(iterate ((cdr L) (- X 1))),相当于把(cdr L)返回的列表当成了可执行函数,参数是(- X 1),这就是报错invalid application: (20 30)的直接原因——系统尝试把列表第一个元素20作为函数执行,显然不合法 - 调用
iterate时你也多套了一层括号,同时没有给字面量列表加引用标记,系统会尝试直接执行列表,也会触发调用错误
- 递归调用
- 第二处是递归终止条件缺失:你仅定义了列表为空、X>0两种情况的处理逻辑,没有定义X=0时返回当前列表的分支,X降到0时函数会返回未定义结果
修正后的代码
(define (iterate L X) (cond ((null? L) '()) ((> X 0) (iterate (cdr L) (- X 1))) (else L)))
正确调用方式
; 执行2次cdr操作 (iterate '((10 20) (20 30) (30 40) (40 50)) 2) ; 输出:((30 40) (40 50)) ; 执行3次cdr操作 (iterate '((10 20) (20 30) (30 40) (40 50)) 3) ; 输出:((40 50))
注意:字面量列表作为参数传递时,必须在前面加单引号
',否则系统会默认将列表判定为可执行函数调用,也会触发对应报错。
内容的提问来源于stack exchange,提问作者Colin Charlesworth
相关产品推荐
相关产品推荐

