質問

私は「コンピュータープログラムの構造と解釈」を経験しています。 2.1 )。 R5RSモードでDrracketでコーディングしています。

これが私のコードです:

(define (make-rat n d) 
  (let (((c (gcd n d))
         (neg (< (* n d) 0))
         (n (/ (abs n) c))
         (d (/ (abs d) c)))
        (cons (if neg (- n) n) d))))

そして、これがDrracketが私に与えているエラーメッセージです:

let: bad syntax (not an identifier and expression for a binding) in: ((c (gcd n d)) (neg (< (* n d) 0)) (pn (/ (abs n) c)) (pd (/ (abs d) c)))

私は台無しにしたと思います。しかし、私はそれを修正する方法がわかりません。

役に立ちましたか?

解決

編集が示すように、識別子を早期に使用しています。 (そのため、余分な括弧の構文問題を修正した後に機能しないのです。)「let」の識別子はお互いを見ないでください。 2番目の3つのLetsを1つ目の下にネストする必要があります。

    (let ((c (gcd ...)))
      (let ((...))
        exps ...))

SICPが他のLETフォームを導入した場合//場合は覚えていませんが、ネストされたレットをたくさん使用して立ち往生している場合は、使用できます let* その後の各識別子は、前のすべての範囲にあります。つまり、次の2つの定義は同等です。

(define foo
  (let* ((a 1)
         (b (+ 1 a))
         (c (+ 1 b)))
    (+ 1 c)))

(define foo
  (let ((a 1))
    (let ((b (+ 1 a)))
      (let ((c (+ 1 b)))
        (+ 1 c)))))

残念ながら、異なるletフォームのスコーピングルールは、初心者にとっては少し大きくなる可能性があります。

他のヒント

変数宣言の周りに追加の括弧付きのセットを追加しました。

また、cを使用してnとdを定義したため、適切に機能するようにlet*に変更する必要がありました

私の固定コード:

(define (make-rat n d) 
  (let* ((c (gcd n d))
         (neg (< (* n d) 0))
         (n (/ (abs n) c))
         (d (/ (abs d) c)))
        (cons (if neg (- n) n) d)))

これを試して:

(define (make-rat n d)
  (let ([c (gcd n d)]
        [neg (< (* n d) 0)]
        [n (/ (abs n) c)]
        [d (/ (abs d) c)])
    (cons (if neg
              (- n)
              n) 
          d)))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top