Pregunta

que estoy pasando "Estructura e Interpretación de programas de ordenador" y estoy teniendo un poco de problemas para hacer uno de los ejercicios ( 2,1 ). Estoy de codificación en DrRacket en modo R5RS.

aquí está mi código:

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

Y aquí está la DrRacket mensaje de error me está 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)))

creo que he estropeado la sintaxis de let. pero no estoy seguro de cómo solucionarlo.

¿Fue útil?

Solución

A medida que su edición indica, está utilizando el identificador c prematuramente. (Es por eso que no está funcionando después de solucionar el problema de sintaxis del paréntesis extra.) Identificadores de "dejar" no ver entre sí. Que había necesidad de nido de su segundo de tres deja debajo de la primera.

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

Yo no recuerdo cuando / si SICP introduce otras formas vamos, pero si usted está atascado utilizando una gran cantidad de anidada permite, puede utilizar let* en el que cada identificador es posterior en el ámbito de todos los anteriores. Es decir, las dos definiciones siguientes son equivalentes:

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

Las reglas de alcance de las diferentes formas vamos puede ser un poco demasiado para un principiante, por desgracia.

Otros consejos

He añadido un conjunto adicional de paréntesis en torno a las declaraciones de variables, gritos.

También, ya que utiliza C para definir nyd, que tenía que cambiar dejó entrar en let * para que funcione correctamente

mi código fijo:

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

Prueba esto:

(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)))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top