racket - 球拍:为什么不能编译?
问题描述
我正在尝试编写一个简单的函数,该函数将整数添加到从“高”和“低”范围递减的列表中,并以“步长”递增
例如,如果输入为 (3 12 3),则预期输出为 '(12 9 6 3)
以下是以下代码:
(define (downSeries step high low [(define ret '())])
(if (< high low)
ret
(cons ret (- high step))
(downSeries (step (- high step) low))))
我对球拍很陌生,但我真的不确定为什么不编译。有小费吗?谢谢你。
解决方案
由于仅标记了球拍并且没有描述特殊语言,因此定义窗口中的第一行是#lang racket
. 学生语言的答案会有所不同。
1 最后一个参数嵌套在两个括号中,是非法的语法。默认参数只有一组:
(define (test mandatory (optional '()))
(list mandatory optional))
(test 1) ; ==> (1 ())
(test 1 2) ; ==> (1 2)
2 您的if
表单中有 4 个操作数。最多需要3个!
(if prediate-expression
then-expression
else-expression)
查看代码,您应该cons
在参数位置有ret
表达式。在递归之前拥有它会使它成为死代码。ret
永远都是()
。例如,这类似于典型的折叠实现:
(define (fold-1 combine init lst)
(if (null? lst)
init ; fully grown init returned
(fold-1 combine
(combine (car lst) init) ; init grows
(cdr lst))))