Domanda

che sto passando "Struttura e interpretazione dei programmi del computer" e sto avendo un po 'di problemi a fare uno degli esercizi ( 2.1 ). Sto codifica in DrRacket in modalità R5RS.

ecco il mio codice:

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

Ed ecco la DrRacket messaggio di errore mi sta dando:

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

credo di aver incasinato la sintassi del let. ma non sono sicuro di come risolvere il problema.

È stato utile?

Soluzione

Come la modifica indica, si sta utilizzando il c identificatore prematuramente. (Che è il motivo per cui non funziona dopo aver fissato il problema della sintassi della parentesi in più.) Identificatori a "lasciare" non vedere l'altro. Avresti bisogno di nido il secondo di tre lascia sotto il primo.

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

Non ricordo quando / se SICP introduce altre forme Let, ma se sei bloccato con un sacco di nidificato permette, è possibile utilizzare let* in cui ogni identificatore successivo è nel campo di applicazione tutti i precedenti. Cioè, i seguenti due definizioni sono equivalenti:

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

Le regole di visibilità delle diverse forme Let può essere un po 'troppo per un principiante, purtroppo.

Altri suggerimenti

ho aggiunto un ulteriore set di parentesi attorno alle dichiarazioni di variabili, urla.

Inoltre, dal momento che ho usato per definire c n e d, ho dovuto cambiare immessa let * per farlo funzionare correttamente

il mio codice fisso:

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

Prova questo:

(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)))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top