Frage

Ich werde durch „Struktur und Interpretation von Computerprogrammen“ und ich bin ein wenig Mühe mit einem der Übungen ( 2.1 ). Ich bin Codierung in DrRacket in R5RS-Modus.

hier ist mein Code:

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

und hier ist die Fehlermeldung DrRacket mir gibt:

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

Ich glaube, ich habe let Syntax vermasselt. aber ich bin nicht sicher, wie es zu beheben.

War es hilfreich?

Lösung

Wie deine Bearbeitung zeigt, verwenden Sie die c-Kennung vorzeitig. (Deshalb ist es nicht nach dem Fixieren der Syntax Ausgabe der zusätzlichen Klammern zu arbeiten.) Identifiers in „lassen“ sie nicht sehen. Sie würden zu nisten benötigen zweiten drei können unter dem ersten.

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

Ich erinnere mich nicht, wenn / falls SICP andere let Formen führt, aber wenn Sie nicht verwenden eine Menge von verschachtelten läßt, können Sie let*, in dem jede nachfolgende Kennung im Rahmen ist die Nutzung aller vorherigen. Das heißt, sind die folgenden beiden Definitionen äquivalent:

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

Die Scoping-Regeln der verschiedenen let Formulare können für einen Anfänger ein bisschen viel, leider.

Andere Tipps

Ich habe einen zusätzlichen Satz von Klammern um die Variablendeklarationen, hoppla.

Auch, weil ich c verwendet n und d zu definieren, hatte ich lasse in let ändern *, damit es richtig funktioniert

mein Fest Code:

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

Versuchen Sie diese:

(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)))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top