Question

Je vais par « Structure et interprétation des programmes informatiques » et je vais avoir un peu de mal à faire l'un des exercices ( 2.1 ). Je codage en DrRacket en mode r5rs.

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

et voici le message d'erreur DrRacket me donne:

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

Je pense que je l'ai foiré la syntaxe let. mais je ne suis pas sûr de savoir comment le résoudre.

Était-ce utile?

La solution

En tant que votre édition indique, vous utilisez l'identifiant c prématurément. (Ce qui est la raison pour laquelle il ne fonctionne pas après la résolution du problème de syntaxe de la parenthèse supplémentaire.) Identifiers dans « let » ne voient pas. Vous auriez besoin nicher votre deuxième trois laisse sous le premier.

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

Je ne me souviens pas quand / si SICP introduit d'autres formes let, mais si vous êtes coincé en utilisant beaucoup de imbriqué permet, vous pouvez utiliser let* dans lequel chaque identifiant suivant est dans le cadre de toutes les précédentes. Autrement dit, les deux définitions suivantes sont équivalentes:

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

Les règles de portée des différentes formes let peut être un peu beaucoup pour un débutant, malheureusement.

Autres conseils

J'ajouté un ensemble supplémentaire de parenthèses autour des déclarations variables, oups.

En outre, depuis que j'utilisé pour définir c n et d, je devais changer en laisser let * pour le faire fonctionner correctement

mon code fixe:

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

Essayez ceci:

(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)))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top