2017-05-31 3 views
0

mon code affiche cette erreur - function call: expected a function after the open parenthesis, but received (void)Erreur d'appel de fonction dans le schéma

Je ne sais pas pourquoi. son sur la 3ème ligne

(define countdown 
    (lambda (n) 
    (cond ((zero? n) ((display "Time") (newline))) 
     (else 
     ((display n) (newline) (countdown (- n 1))))))) 

Répondre

1

Lors de l'utilisation cond déclarations, vous n'avez pas besoin de parenthèses autour des expressions conséquence. La structure générale est:

(cond (condition1 expr1 expr2 expr3 ...)  ;; NOT (... (expr1 expr2 expr3 ...)) 
     (condition2 expr1 expr2 expr3 ...) 
     ... 
     (else ...)) 

si votre cas peut être fixé à:

(cond ((zero? n) (display "Time") (newline)) 
     (else (display n) (newline) (countdown (- n 1)))) 

et la procédure peut être réécrite comme:

(define countdown 
    (lambda (n) 
    (cond ((zero? n) 
      (displayln "Time")) 
      (else 
      (displayln n) 
      (countdown (- n 1)))))) 

Si vous incluez entre parenthèses autour des expressions de conséquence, par exemple, ayant

((display "Time") (newline)) 

alors ce sera interprété comme une procédure

(procedure-name arg) 

procedure-name prend la valeur de (display "Time") et arg prend la valeur de (newline). Puisque (display "Time") est seulement pour l'effet secondaire sans valeur de retour, vous obtenez la constante #<void> pour la procédure et donc le message d'erreur: prévu une procédure qui peut être appliquée aux arguments.

1

Voici une définition de abs:

(define (abs n) 
    ((if (< n 0) - +) n)) 

Administré un nombre négatif le résultat de l'évaluation - est retourné autre + donc si vous deviez passer -5 il devient (- -5) et dans le cas 5 est adopté, il devient (+ 5). Les deux évaluent à 5. Voyez-vous que j'utilise le retour d'une expression en tant que fonction? Voilà ce que les parenthèses signifient .. Dans un langage C comme je aurais pu faire quelque chose comme (n < 0 ? sub : add)(0, n)

Dans votre cond en faisant abstraction des parenthèses qui entourent chaque terme vous avez doubles entre parenthèses plusieurs endroits:

((display "Time") (newline)) 
((display n) (newline) (countdown (- n 1))) 

Les deux supposent que la fonction d'affichage renvoie une fonction que l'on peut appliquer. Ce n'est pas le cas et il échouera en vous disant que ce n'est pas une fonction.

Si vous cherchez à regrouper des commandes, par exemple {} en langage C, alors vous recherchez le formulaire spécial begin. par exemple.(begin 1 2 3) ; ==> 3

cond a explicitement begin dans chacun de ses termes, donc si vous vouliez juste pour chaque partie a évalué la solution ressemble à ceci:

(define (countdown n) 
    (cond ((zero? n) (display "Time") (newline)) 
     (else (display n) (newline) (countdown (- n 1))))) 

Une autre façon de formater est la suivante:

(define (countdown n) 
    (cond 
    ((zero? n) 
    (display "Time") (newline)) 
    (else 
    (display n) 
    (newline) 
    (countdown (- n 1))))) 

Les parenthèses de notification sont alignées avec le même niveau afin que vous sachiez quand le prochain terme commence. Il vous aide à lire le code puisque votre mise en forme dans la question ne donne aucune indication. Obtenez un éditeur approprié pour faire votre codage.