2017-05-13 7 views
-1

Si j'utilise le code suivant du chapitre 1 de SICP il donne la bonne réponse.Exemple SICP. cond fonctionne mais si non

(cond ((= a 4) 6) ((= b 4) (+ 6 7 a)) (else 25)) 

impressions 16

Si je remplace le par un si cond ne fonctionne pas

(if ((= a 4)6) ((= b 4) (+ 6 7 a)) (else 25)) 

donne erreur:

The object #f is not applicable. 

Qu'est-ce que je fais mal? Pourquoi le si ne fonctionne pas?

N.B. Ceci est de l'exercice 1.1 avec les définitions:

(define a 3) 
(define b (+ a 1)) 

Répondre

2

cond et if sont deux constructions syntaxiques très différentes. Vous ne pouvez pas simplement substituer le nom de l'un à l'autre.

Si la syntaxe:

(if test 
    (then part) 
    (else part)) 

syntaxe Cond:

(cond (test1 form11 ... form1n) 
     (test2 form12 ... form2n) 
     ... 
     (else form1m ... formmn)) 

Ainsi, l'équivalent de:

(cond ((= a 4) 6) 
     ((= b 4) (+ 6 7 a)) 
     (else 25)) 

est:

(if (= a 4) 
    6 
    (if (= b 4) 
     (+ 6 7 a) 
     25)) 
+0

merci beaucoup. J'ai une autre question: quelle serait la forme correcte de ce qui suit: '' '(if ((= ba) 6) 25)' '' J'ai compris comment utiliser '' '' '' '' '' '' ne semble pas comprendre «si». Je veux vérifier si b = a puis 6 sinon 25. – darthcoder

+0

Comme je l'ai dit, la forme correcte est '(if condition then-part else-part)' donc votre exemple devrait être écrit '(if (= ba) 6 25) '. Gardez à l'esprit que dans le schéma, les parenthèses sont significatives, différemment de presque toutes les autres langues. Pour isntance si vous écrivez '(if ((= ba) 6) 25)' ceci est interprété comme: '(si x 25)' (faux parce que vous avez 2 arguments à 'if' au lieu de 3), où x est' ((= ba) 6) ', qui est interprété comme: évalue' (= ba) ', puis applique la fonction retournée à 6 (à cause de' ((...) 6) '), ce qui produit une autre erreur depuis' (= ba) 'renvoie' #t' ou '# f' et non une fonction. – Renzo

+0

Notez que si vous voulez apprendre Scheme sans vous perdre avec toutes ces parenthèses, vous devez aligner correctement le code, et cela peut être grandement simplifié en utilisant un éditeur de texte qui comprend la syntaxe Schema, comme Emacs ou DrRacket. – Renzo