1

我在方案中编写了以下代码片段,

(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))))))

但是,我收到以下错误

let: 语法错误(不是绑定的标识符和表达式) in: (next-divisor)

我该如何纠正它?

4

2 回答 2

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 教程并尝试编写一些基本程序来掌握它,特别是这里let特殊形式的文档和正确结构:

(let ([id val-expr] ...) body ...+)

第一种形式从左到右评估 val-exprs,为每个 id 创建一个新位置,并将值放入位置。然后它评估绑定了 id 的 body。最后一个主体表达式相对于 let 形式位于尾部位置。id 必须根据 bound-identifier=?

此外,使用 IDE/编辑器来突出此类问题并帮助您正确缩进代码也是一个好主意。特别要注意,当您编写以下代码时,不得将变量括在括号中:(x)Scheme 假定这x是一个过程并且您正在调用它。

于 2012-12-22T14:28:14.857 回答
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))))
  ;; ...
  )
于 2012-12-22T16:48:15.413 回答