2010-12-06 6 views
1

Je suis en train d'écrire un programme de système pour lire en 2 chiffres et afficher leur addition, mais ai problème avec l'expression « let »problème de schéma avec « let »

(define (add-two) 
    (let* ((first ((display "Enter first number:") 
       (read))) 
     (second ((display "Enter second number:") 
       (read)))) 
     (sum (+ first second)) 
     ) 
    (display "total is " sum) 
    ) 

Après avoir lu le premier numéro, le programme se bloque ... et les points à l'expression let, le compilateur rapports

« application procédure: procédure attendue, étant donné: #; arguments étaient: 4 '

Je ne sais pas comment résoudre ce problème ... Que pensez-vous est faux?

merci à l'avance!

+0

Vous ne nous ont pas dit ce que va mal. – bmargulies

+0

okay, j'ai expliqué l'erreur je reçois plus en détail, merci bmargulies. – Roy

Répondre

3

Il semble que vous ayez un jeu de parenthèses incompatibles. Essayez:

(define (add-two) 
    (let* ((first (begin 
        (display "Enter first number:") 
        (read))) 
     (second (begin 
        (display "Enter second number:") 
        (read))) 
     (sum (+ first second))) 
    (display "total is " sum))) 

Dans la forme let*, le premier groupe entre parenthèses les nouvelles liaisons ensemble, puis le reste d'entre eux (juste display dans cet exemple) est le corps. En général:

(let* ((a1 x1) (a2 x2) ...) body ...) 
+0

merci beaucoup. – Roy

3

Le problème est pas let, mais dans application procédure. Regardez votre première expression let:

(first ((display "Enter first number:") 
       (read))) 

Vous essayez de lier au symbole first résultat de l'expression ((display "Enter first number:") (read)). Je comprends que vous vous attendez à ce que cela fasse 2 actions: afficher le message et lire l'entrée, mais ce ne sera pas le cas. La première expression (c'est-à-dire (display "Enter first number: ")) sera évaluée à void#. La deuxième expression donnera une entrée. Après que 2 arguments seront évalués, Scheme verra une expression (void# 4). Mais c'est une application de procédure! Et Scheme vous en parle avec votre message d'erreur.

Pour éviter cela, vous pouvez faire 2 choses: Afficher un message avantlet expression:

(define (add-two) 
    (display "Enter first number:") 
    (let (first (read)) 
     (display "Enter second number:") 
     (let second (read)) 
     ... 

Ou utiliser la procédure begin pour évaluer les expressions de façon séquentielle:

(define (add-two) 
    (let* ((first (begin (display "Enter first number:") 
         (read))) 
      (second (begin (display "Enter second number:") 
         (read)))) 
      ... 
+0

merci pour l'élaboration, beaucoup plus clair maintenant. – Roy

Questions connexes