让方案出错

时间:2012-12-22 13:36:36

标签: lisp scheme

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

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

我如何纠正它?

2 个答案:

答案 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))))
  ;; ...
  )