todo lo relevante ya se ha Sayd, pero sólo para su diversión:
Como ya se ha dicho,
rcvr ifTrue:[...] ifFalse:[...]
es el único y solo mensaje # 'ifTrue: ifFalse:' con 2 args enviado a rcvr. El valor de esa expresión es el de ese mensaje enviado. En contraste:
rcvr ifTrue:[...]; ifFalse:[...]
es una cascada de 2 mensajes secuenciales (# 'ifTrue: 'y #' ifFalse:'), cada uno con 1 arg enviado a RCVR. El valor de la expresión es el devuelto desde el último envío.
Ahora lo curioso es que booleanos entienden ifTrue:/ifFalse: (cada uno con 1 arg), lo que el código funciona para el efecto secundario (evaluación de esos bloques), pero no por su valor. Esto significa que:
a > b ifTrue:[Transcript showCR:'gt'] ; ifFalse:[Transcript showCR:'le']
genera la misma salida que:
a > b ifTrue:[Transcript showCR:'gt'] ifFalse:[Transcript showCR:'le']
pero:
msg := a > b ifTrue:['gt'] ; ifFalse:['le']
generará valores diferentes en msg que:
msg := a > b ifTrue:['gt'] ifFalse:['le']
según los valores de a y b. Pruebe (a b) = (1 2) vs. (a b) = (2 1) ...
El problema de muchos principiantes Smalltalk es que piensan en ifXXX: como sintaxis, donde en realidad es un mensaje de envío que genera valor. Además, el semi no es un separador de enunciados como en muchos lenguajes aprendidos previamente, sino un constructo de secuencia de envío de mensajes.
Una trampa mala para los principiantes, porque el código parece funcionar para algunas combinaciones de valores particulares, mientras que genera resultados divertidos para los demás. Esperemos que las pruebas unitarias cubren estos ;-)
de edición: para ver donde el valor malo viene, echar un vistazo a lo que se devuelve por el booleana >> ifFalse: método para un verdadero receptor ...
Solo por completitud, el; es para una _cascada_ - una secuencia de mensajes enviados al mismo objeto. foo bar; baz. es idéntico en significado a foo bar. foo baz. –
su comprensión es incorrecta; no es "recibe ... Y LUEGO ...", sino "recibe un mensaje". Ver mi respuesta a continuación. – blabla999