Hola. Hacía muchísimo tiempo que no escribía por aquí. Y es que parece que sólo en vacaciones puedo volcar mis energías en esta gran afición por el Spectrum.
Bueno, al caso.
Vereis, estoy haciendo pruebas con el SAM BASIC y, a las primeras de cambio, me he encontrado con una desagradable sorpresa. El caso es que me gustaría que alguien con un SAM Coupé físico comprobara esto:
El siguiente ejemplo muestra como se pueden pasar un número de argumentos indeterminados a un procedimiento mediante el uso de las instrucciones ITEM y DATA. ITEM devuelve el tipo del siguiente dato a leer mediante READ (1 si es una cadena de texto, 2 si es un número, y 0 si ya no quedan datos que leer)
10 DEFPROC ruido DATA
20 LOCAL a
30 DO UNTIL ITEM = 0 : REM Repite el bucle hasta (until) que ya no haya datos que leer
40 READ a
50 BEEP 1,a
60 LOOP
70 ENDPROC
80 ruido 10,50,3,20,32
Los datos suministrados pueden ser literales o variables de cualquier tipo y estar en cualquier orden.
5 let a$ = "y mas ruido"
10 DEFPROC ruido DATA
20 LOCAL a, a$
30 DO UNTIL ITEM = 0 : REM Repite el bucle hasta (until) que ya no haya datos que leer
40 IF ITEM = 2 THEN READ a: BEEP 1,a: ELSE READ a$: PRINT a$
60 LOOP
70 ENDPROC
80 ruido 10,"ruido",3,32,a$
El código anterior debería, además de reproducir los sonidos indicados como parámetros, mostrar en pantalla dos líneas con las leyendas "ruido" y "y mas ruido". En vez de eso, imprime "ruido" dos veces. La causa está relacionada con el uso de una variable local con el mismo nombre que otra global (a$). El motivo no alcanzo a comprenderlo, y lo considero un "bug". Modificando el nombre de la variable global o la local, funciona correctamente.
5 let b$ = "y mas ruido" : REM Nombre de la variable cambiado
10 DEFPROC ruido DATA
20 LOCAL a, a$
30 DO UNTIL ITEM = 0 : REM Repite el bucle hasta (until) que ya no haya datos que leer
40 IF ITEM = 2 THEN READ a: BEEP 1,a: ELSE READ a$: PRINT a$
60 LOOP
70 ENDPROC
80 ruido 10,"ruido",3,32,b$
Curiosamente, si se incluye la linea siguiente:
90 PRINT a
Obtendremos como respuesta el número 32, es decir, el último dato numérico leido en el procedimiento: ¡el contenido de una variable local a un procedimiento a transcendido al mismo!
Esto no parece ser nada bueno, así que me gustaría saber si le pasaba a la máquina real o si es un "bug" del emulador que utilizo.
Si alguien me puede ayudar se lo agradeceré, porque seguir o no con el SAM depende de la respuesta a mi pregunta.
Gracias anticipadas.