Problema con 'let' di sintassi nel programma
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.
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)))