2009-07-17 14 views
16

Tenía un requisito bastante simple en mi programa Scheme para ejecutar más que una declaración, en la condición verdadera de un 'si'. . Así que escribir mi código , algo como esto:Acerca de "If ..." en Scheme (esquema-plt)

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

Obviamente, lo anterior no funciona, ya que tengo involuntariamente creado un procedimiento # con # argumentos. Por lo tanto, para realizar mi trabajo , simplemente coloco las expresiones anteriores en una nueva función y lo llamo desde allí, en lugar de la expresión1, expresión2. Es funciona.

Entonces, mi punto aquí es: ¿hay alguna otra construcción condicional que pueda soportar mis requerimientos aquí?

Respuesta

22

En el MIT-Scheme, que no es muy diferente, puede utilizar begin:

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

O utilice Cond:

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

tenga en cuenta que la segunda expresión es realmente lo mismo que la primera: la (cond ...) functi on tiene un implícito (comienzo ...) dentro de cada condición que verifica, por lo que son obscenamente iguales. –

1

Puede usar COND, o poner las expresiones en algo así como PROGN en Lisp (no estoy seguro de cómo se llama en el esquema PLT. editar: se llama BEGIN).

COND se ve así en el esquema:

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

puede usar (comenzar ...) para obtener lo que desea en la verdadera rama de su declaración if. Consulte here

2

(begin ...) es cómo evalúa varias expresiones y devuelve la última. Muchas otras construcciones actúan como bloques "implícitos" begin (permiten múltiples expresiones como un bloque begin pero no necesita decir begin), como el cuerpo de una cláusula cond, el cuerpo de una define para funciones, el cuerpo de un lambda, el cuerpo de un let, etc .; puede haber estado usándolo sin darse cuenta. Pero para if, eso no es posible en la sintaxis porque hay dos expresiones (una para verdadero y otra para falso) una al lado de la otra, por lo que permitir múltiples expresiones la convertiría en ambigua. Por lo tanto, debe usar una construcción explícita begin.

0

El uso de un comunicado if con más de dos casos implica anidación, por ejemplo:

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

Usando cond parece ser la forma preferida para la expresión de los estados condicionales, ya que es más fácil de leer que un montón de anidados if s y también se puede ejecutar múltiples sentencias sin tener que utilizar la cláusula begin:

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