質問
私は「コンピュータープログラムの構造と解釈」を経験しています。 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)))
所属していません StackOverflow