La sentencia IF en el Spectrum y equivalentes a IF THEN ELSE en el Basic Sinclair He reunido en este texto todas mis notas sobre la sentencia IF. Como siempre pensando en la conversion de un lenguaje de programacion a otro, en este caso al Basic del Spectrum. If en LOGO La version LCSI de Logo Sinclair admite la sigte sintaxis: IF cond [then] [else] si se cumple cond entonces se ejecuta la lista de instrucciones [then] pero sino, se ejecuta la lista [else]. IF opera con una o mas lineas de instrucciones. Otras versiones como APPLE Logo usan THEN y ELSE, siendo THEN opcional. Pascal Su sintaxis no es para nada diferente a la usada por el Basic. IF en Fortran sintaxis: IF (e) label1, label2, label3 Conocido como IF aritmetico, originalmente FORTRAN, es una sentencia condicional de 3 vias a las que salta dependiendo de la expresion (e) la cual solo puede ser negativo, cero y positivo. El equivalente en BASIC seria el sigte: IF e<0 THEN GOTO label1 IF e=0 THEN GOTO label2 IF e THEN GOTO label3 En el Spectrum esta version de IF puede reemplazarse por: GOTO (label1 AND e<0)+(label2 AND e=0)+(label3 AND e>0) IF en los primeros BASICs sintaxis 1: IF cond THEN linea sintaxis 2: IF cond GOTO linea Las primeras versiones de Basic tenian un IF dedicado solamente al salto de linea, mal utilizado daba lo que muchos programadores expertos llaman el lenguaje "espagueti" que hacia confuso seguir, comprender y corregir el listado, dandole eso mala fama al BASIC, al punto de crearse la regla "GOTOless" o sea un lenguaje sin goto como COMAL. El BASIC sin expansion del TI-99/4A solo admite la sintaxis 1. Commodore admite incluso una variante a la sintaxis2: IF cond GOSUB linea en este caso THEN es omitible y va a la linea de la subrutina segun cond. El basic del Spectrum no admite ninguna de esas formas, solamente: IF cond THEN GOTO linea Ahora, uno podria pensar que se la puede reemplazar por: GOTO (linea AND cond) pero esto solo funciona si se cumple la condicion, de lo contrario hara un salto a la linea cero, o sea al comienzo del programa. IF en la mayoria de BASICs sintaxis: IF cond THEN sent {:sent2 :sent3 .....} ZX-80 y ZX-81 solo admiten una sentencia luego de THEN, a diferencia del Spectrum. El Basic Sinclair devuelve 1 para verdadero y 0 para falso, a diferencia de otros BASICs como el de Commodore que devuelven -1 para cierto, manteniendose siempre 0 para falso. IF extendido sintaxis: IF cond THEN sent1 ELSE sent2 Mucho se le ha criticado al Basic Sinclair por carecer de ELSE, pero tambien es inexistente en las versiones de BASIC de Apple II, Atari y Commodore, asi como el New Brain. Esta instruccion esta presente en la mayoria de versiones de BASIC Microsoft como el GW Basic, MSX Basic, Oric Basic, Dragon y TRS-80 Basic. Tambien esta en las versiones estructuradas como BBC Basic y QL Superbasic. Ya que el Spectrum carece de esta instruccion, se debe dividir la linea: IF cond THEN sent1 sent2 En algunos casos podemos definirla del modo sigte: sent2: IF cond THEN sent1 Ejemplos: a) 1000 IF i=10 THEN 200 ELSE 400 en el Spectrum equivale a: 1000 IF i=10 THEN GOTO 200 1005 GOTO 400 es la mas usada en Basic Sinclair, pero no es la unica alternativa: 1000 LET gt=400: IF i=10 THEN LET gt=200 1005 GOTO gt este tipo de condicion se puede sustituir aun por: 1000 GOTO 400-(200 AND i=10) b) 100 IF a=A" en el Spectrum: 100 LET z$="B>=A": IF a.005 THEN B=1/A: A=A/6 ELSE 400 en el Spectrum: 200 IF d>.005 THEN LET B=1/A: LET A=A/6: GOTO 210 205 GOTO 400 210 REM ... d) 40 IF A=B THEN X=B ELSE X=A en el Spectrum: 40 LET X=A: IF A=B THEN LET X=B IF anidadas En el Basic del Spectrum es valido hacer por ejemplo: IF A THEN IF B THEN PRINT B solo que en ese caso hubiera sido mejor tipear: IF A AND B THEN PRINT B pero existen otros casos en los que si es necesario hacer un IF...THEN IF... Pero: IF condA THEN IF condB THEN sent1 ELSE sent2 ELSE IF condC THEN sent 3 ELSE sent4 obliga a hacer mas trucos en el Spectrum. Ejemplos: a) IF x>y THEN PRINT "mas grande" ELSE IF xy THEN PRINT "mas grande": GOTO 310 200 IF xy THEN LET p$="mas grande" 200 IF xy)+("mas pequeno" AND xy THEN IF xy" ELSE PRINT "x=y" su conversion al Spectrum es de nuevo como en el ejemplo a. IF multilineas sintaxis: IF cond THEN sent1 {ELSE sent2} ENDIF Este tipo de IF pertenece a los lenguajes estructurados como Pascal, C o Logo, ademas de versiones de Basic como QuickBasic, BBC basic o el QL Superbasic. Un ejemplo QuickBasic: If Len(arg1) > 10 Then Reply = 1 Reply = Arg2 * Reply Else Reply = 2 Reply = (Arg2 - 1) * Reply Endif En el Spectrum: 100 IF L(arg1)>10 THEN LET Reply=1: LET Reply=Arg2*Reply: GOTO 200 110 LET Reply=2 120 LET Reply=(Arg2-1)*Reply 200 ... En casos como el IF multilineas o IF multilineas anidados, su conversion al Spectrum solo es posible mediante uso de GOTOs o GOSUBs. O incluso una combinacion de ambas. IF como expresion o funcion ALGOL 60 y otros miembros de la familia ALGOL permiten if–then–else como expresion: myvariable := if x > 10 then 1 else 2 C y lenguajes tipo C tienen un operador especial (?:) para expresiones condicionales con una funcion que puede describirse asi: condition ? evaluated-when-true : evaluated-when-false Ejemplo: my_variable = (x > 10) ? "foo" : "bar"; // In C-like languages En el Spectrum podemos definir una funcion que haga lo mismo: DEF FN i(x,y,z)=(y AND x)+(z AND NOT x) - para numeros y DEF FN i$(x,y$,z$)=(y$ AND x)+(z$ AND NOT x) - para cadenas De este modo el ejemplo de ALGOL se convertiria en: LET myvariable = FN i(x>10,1,2) Mientras que el ejemplo de C se conveierte en: LET m$ = FN i$(x>10,"foo","bar") A manera de cierre mencionar que si el usuario de Spectrum desea de todos modos ver ELSE en sus listados, solo queda trabajar con BetaBasic en cualquiera de sus versiones. (c)2017 zx_if1@hotmail.com