2009-07-17 5 views
16

J'ai eu une exigence assez simple dans mon programme Scheme pour exécuter plus qu'une instruction, dans la condition vrai d'un 'si'. . Alors j'écrire mon code , quelque chose comme ceci:À propos de "If .." dans Scheme (plt-scheme)

(if (= 1 1) 
((expression1) (expression2)) ; these 2 expressions are to be 
           ; executed when the condition is true 
    (expression3)) 

De toute évidence, le ne fonctionne pas, puisque j'ai involontairement créé une procédure de # aveC# arguments. Donc, pour faire mon travail , je mets simplement les expressions ci-dessus dans une nouvelle fonction et l'appelle à partir de là, à la place de l'expression1, expression2. Il fonctionne . Donc, mon point ici est: existe-t-il une autre construction conditionnelle qui peut soutenir mon exigence ici?

Répondre

22

Dans MIT-Scheme, ce qui est très différent, vous pouvez utiliser begin:

(if (= 1 1) 
    (begin expression1 expression2) 
    expression3) 

Ou utilisez Cond:

(cond ((= 1 1) expression1 expression2) 
     (else expression3)) 
+0

Notez que la seconde expression est vraiment la même chose que la première: le (... cond) foncti a un implicite (commencer ...) dans chaque condition qu'il vérifie, donc ils sont obstinément les mêmes. –

1

Vous pouvez utiliser COND, ou mettre les expressions dans quelque chose comme PROGN dans Lisp (je ne suis pas sûr comment il est appelé dans le schéma PLT edit: il est appelé BEGIN).

COND ressemble à ceci dans le schéma:

(cond [(= 1 1) 
     (expression1) 
     (expression2)] 
     [else 
     (expression3)]) 
1

vous pouvez utiliser (commencer ...) pour obtenir ce que vous voulez dans la vraie branche de votre instruction if. Voir here

2

(begin ...) est la façon dont vous évaluez plusieurs expressions et renvoyez la dernière. Beaucoup d'autres constructions agissent comme des blocs "implicites" begin (ils permettent plusieurs expressions comme un bloc begin mais vous n'avez pas besoin de dire begin), comme le corps d'une clause cond, le corps d'un define pour les fonctions, le corps de un lambda, le corps d'un let, etc .; vous l'avez peut-être utilisé sans le savoir. Mais pour if, ce n'est pas possible dans la syntaxe car il y a deux expressions (l'une pour vrai et l'autre pour faux) l'une à côté de l'autre, et donc permettre des expressions multiples le rendrait ambigu. Vous devez donc utiliser une construction begin explicite.

0

En utilisant une déclaration if avec plus de deux cas implique la nidification, par exemple:

(if (test-1)    ; "if" 
    (expression-1) 
    (if (test-2)   ; "else-if" 
     (expression-2) 
     (expression-3))) ; "else" 

L'utilisation cond semble être le meilleur moyen d'exprimer des déclarations conditionnelles comme il est plus facile à lire qu'un tas de if imbriqués s et vous pouvez également exécuter plusieurs instructions sans avoir à utiliser la clause begin:

(cond ((test-1) 
     (expression-1)) 
     ((test-2) 
     (expression-2) 
     (expression-3)) 
     (else 
     (default-expression)))