我在方案中写了以下代码片段,
(define (test-for-prime number divisor)
(cond (prime? number) (number)
(else (let ((next-divisor) (find-next-divisor number (+ 1 divisor)))
(test-for-prime (/ number next-divisor) (next-divisor))))))
但是,我收到以下错误
让:错误的语法(不是绑定的标识符和表达式):( next-divisor)
我如何纠正它?
答案 0 :(得分:2)
试用此版本,它修复了所有语法错误:
(define (test-for-prime number divisor)
(cond ((prime? number)
number)
(else
(let ([next-divisor (find-next-divisor number (+ 1 divisor))])
(test-for-prime (/ number next-divisor) next-divisor)))))
你有很多错位的括号。有些是遗漏的,有些是错的......我建议你仔细阅读一下Scheme教程,然后编写一些基本的程序来解决它,特别是here是文档和正确的结构对于let
特殊表格:
(let ([id val-expr] ...) body ...+)
第一个表单从左到右评估val-exprs,为每个id创建一个新位置,并将值放入位置。然后它评估绑定id的人体。最后一个体表达式相对于let形式处于尾部位置。根据bound-identifier =?
,id必须是不同的
使用IDE /编辑器也是一个好主意,它可以突出显示这类问题并帮助您正确地缩进代码。特别要注意的是,当你写这个变量时,一个变量不能用括号括起来:(x)
Scheme假定x
是一个过程并且你正在调用它。
答案 1 :(得分:1)
Let
具有以下语法(带有两个绑定的示例):
(let ((<var> <expr>)
(<var1> <expr1>))
<body>)
如果我们填写您的let
表单,则您有两个绑定:next-divisor
绑定到任何内容,find-next-divisor
绑定到number
,但还有第三个绑定表单(+ 1 divisor)
不符合let
的语法。
这可能是你想要的:
(let ((next-divisor (find-next-divisor number (+ 1 divisor))))
;; ...
)