【问题标题】:Let error in scheme让方案中的错误
【发布时间】:2012-12-22 13:36:35
【问题描述】:

我在scheme中写了如下代码sn-p,

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

我该如何纠正它?

【问题讨论】:

    标签: lisp scheme


    【解决方案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)))))
    

    你有很多错位的括号。有些缺失,有些是错误的......我建议你好好阅读一个 Scheme 教程并尝试编写一些基本程序来掌握它,特别是 here 是文档和正确的结构let特殊形式:

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

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

    区分

    此外,最好使用 IDE/编辑器来突出显示此类问题并帮助您正确缩进代码。尤其要注意,变量不能用括号括起来,当您编写以下代码时:(x) Scheme 假定 x 是一个过程并且您正在调用它。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-09-09
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        • 1970-01-01
        • 1970-01-01
        • 2018-05-17
        • 2014-08-19
        相关资源
        最近更新 更多