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:構文が正しくありません(バインディングの識別子と式ではありません):(次の除数)

どうすれば修正できますか?

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

かっこが間違って配置されています。欠落しているものもあれば、間違っているものもあります...スキームのチュートリアルをよく読んで、基本的な手順を書いて、コツをつかむことをお勧めします。特に、ここletにドキュメントと特別なフォームの正しい構造があります。:

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

最初のフォームは、val-exprsを左から右に評価し、IDごとに新しい場所を作成し、その場所に値を配置します。次に、IDがバインドされているボディを評価します。最後のボディエクスプレッションは、letフォームに対してテールポジションにあります。IDは、bound-identifier =?に従って区別する必要があります。

また、この種の問題を強調し、コードを適切にインデントするのに役立つIDE/エディターを使用することをお勧めします。特に、これを記述するときは、変数を括弧で囲まないようにする必要があることに注意してください(x)。Schemeは、それxがプロシージャであり、呼び出していることを前提としています。

于 2012-12-22T14:28:14.857 に答える
1

Let次の構文があります(2つのバインディングを持つ例):

(let ((<var> <expr>)
      (<var1> <expr1>))
  <body>)

letフォームに入力すると、2つのバインディングがあります。何next-divisorにもバインドされないものとfind-next-divisorにバインドされるものですが、の構文に適合しないnumber3番目のフォームがあります。(+ 1 divisor)let

これはあなたが望むものかもしれません:

(let ((next-divisor (find-next-divisor number (+ 1 divisor))))
  ;; ...
  )
于 2012-12-22T16:48:15.413 に答える