Un compilador de ZX Spectrum BASIC

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Vie Abr 16, 2010 1:29 pm

na_th_an escribió:Otra cosa que se podía hacer en Sinclair BASIC es esta:

Código: Seleccionar todo

Print ("OOO" and plLives = 3); (" OO" and plLives = 2); ("  O" and plLives = 1); ("   " and plLives = 0);


No recordaba esto (es más, aunque ni siquiera sé si lo llegué a conocer en su momento). Entiendo que a$ and (booleano) vale a$ si booleano es VERDAD, y si no, vale "". ¿Es así? ¿qué sucede con las otras expresiones?

Sin embargo el compilador me dice que

Código: Seleccionar todo

Operator AND cannot be used with STRINGS


¿Piensas añadir compatibilidad para esto? Si no, ¿vas a usar el operador ternario de comparación inline para sustituirlo? Me refiero a algo como:

Código: Seleccionar todo

 Print plLives = 3 ? "OOO" : (plLives = 2 ? " OO" : (plLives = 1 ? "  O" : "   ")) 

Prefiero añadir el formato anterior, para mantener la retrocompatibilidad con el Sinclair BASIC.

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por mcleod_ideafix » Vie Abr 16, 2010 2:53 pm

Boriel escribió:
na_th_an escribió:Otra cosa que se podía hacer en Sinclair BASIC es esta:

Código: Seleccionar todo

Print ("OOO" and plLives = 3); (" OO" and plLives = 2); ("  O" and plLives = 1); ("   " and plLives = 0);


No recordaba esto (es más, aunque ni siquiera sé si lo llegué a conocer en su momento). Entiendo que a$ and (booleano) vale a$ si booleano es VERDAD, y si no, vale "". ¿Es así? ¿qué sucede con las otras expresiones?


Sí, es así. x AND y vale x si "y" es verdadero. Si y es falso, x vale 0 si el tipo es numérico, o "" si es cadena.
En el ejemplo de na_than hay cuatro expresiones, y las cuatro se evaluarían en secuencia. Dado que las condiciones son mutuamente excluyentes, ese código sólo imprimiría una, y sólo una de estas cadenas: "OOOO" o bien " OO" o bien " O" o bien " " o bien, en el resto de los casos, "".

De hecho, el ejemplo anterior se puede poner como una sola expresión, así:

Código: Seleccionar todo

Print ("OOO" and plLives = 3)+(" OO" and plLives = 2)+("  O" and plLives = 1)+("   " and plLives = 0);


Internamente se puede equiparar el x AND y al operador ternario:
x AND y (con x numérico) <==> y? x:0
x AND y (con x alfanumérico) <==> y? x:""
Web: ZX Projects | Twitter: @zxprojects

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Vie Abr 16, 2010 3:06 pm

Entonces es distinto de python, por ejemplo, y se parece más a la construcción en C que puso na_than.
Con las OR, por ejemplo, haciendo analogía con python:

  • "CADENA" OR x debería devolver siempre "CADENA" (evaluación en cortocircuito) o si no, tiene que devolver x si x <> 0 si no, "CADENA"
  • x OR "CADENA" debería devolver x si x <> 0 (evaluación en cortocircuito), si no, "CADENA". Si no cortocircuito, devolverá siempre "CADENA"
Pero por lo que he visto. ("CADENA" and X) => siempre es de tipo STRING, y devuelve "" si x == 0. ¿Si se invierte el orden de los operandos da igual?
¿O sea, (x and "CADENA") es de tipo STRING? En este casi si es compilable. Pero si el tipo de la expresión es dinámico (por ej. puede ser STRING o NUMERICO dependiendo del resultado de la expresión) entonces no se podrá compilar. :|

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por mcleod_ideafix » Vie Abr 16, 2010 4:42 pm

Boriel escribió:Pero por lo que he visto. ("CADENA" and X) => siempre es de tipo STRING, y devuelve "" si x == 0. ¿Si se invierte el orden de los operandos da igual?


Si inviertes el orden de los operandos, la expresión resultante no es válida en Sinclair BASIC. Lo que está a la derecha del AND o del OR debe ser una expresión que devuelva verdadero o falso. Es decir, numérica, o booleana.
Web: ZX Projects | Twitter: @zxprojects

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Sab Abr 17, 2010 12:43 am

Estoy viendo que sólo se implementa con AND, y exclusivamente en el orden que dices. O sea es un caso muy particular. Así que lo implementaré de la misma manera. ¿Esto viene en alguna parte del manual?

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por mcleod_ideafix » Sab Abr 17, 2010 4:41 am

Boriel escribió:Estoy viendo que sólo se implementa con AND, y exclusivamente en el orden que dices. O sea es un caso muy particular. Así que lo implementaré de la misma manera. ¿Esto viene en alguna parte del manual?


En el capítulo 13.
http://www.worldofspectrum.org/ZXBasicM ... hap13.html

Es la parte que empieza con "La siguiente sección es complicada, y los que tengan alguna dolencia del corazón pueden saltársela".
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Lun Abr 19, 2010 8:50 am

Perfecto :)

Luego he tenido un problema con string slicing. Para obtener el carácter n-ésimo de "cadena", he entendido que se emplea la sintaxis "cadena (n to n)", o llamando a mid, "mid (cadena, n, 1)".

Con este código, usando mid [y = Val (Mid (terrain, i, 1) )]:

Código: Seleccionar todo

Sub terrainDraw (terrain As String)
   ' Draws a terrain based on heights in string terrain
   
   For i = 0 To 31
      y = Val (Mid (terrain, i, 1))   
      For j = 0 To y
         If j < y Then
            Print At 21-j, i; Ink 3; Chr (105 + Int (Rnd * 2))
         Else
            Print At 21-j, i; Ink 4; "b"
         End If
      Next j
   Next i
End Sub


Obtengo la siguiente salida (algo fue mal):

Código: Seleccionar todo

Traceback (most recent call last):
  File "zxb.py", line 255, in <module>
  File "zxb.py", line 197, in main
  File "ply\yacc.pyc", line 263, in parse
  File "ply\yacc.pyc", line 710, in parseopt
  File "zxbparser.pyc", line 3968, in p_val
KeyError: None


Usando slicing [y = Val (terrain (i To i))]:

Código: Seleccionar todo

Sub terrainDraw (terrain As String)
   ' Draws a terrain based on heights in string terrain
   
   For i = 0 To 31
      y = Val (terrain (i To i))
      For j = 0 To y
         If j < y Then
            Print At 21-j, i; Ink 3; Chr (105 + Int (Rnd * 2))
         Else
            Print At 21-j, i; Ink 4; "b"
         End If
      Next j
   Next i
End Sub


La salida es:

Código: Seleccionar todo

Traceback (most recent call last):
  File "zxb.py", line 255, in <module>
  File "zxb.py", line 203, in main
  File "zxbtrad.pyc", line 250, in traverse
  File "zxbtrad.pyc", line 959, in traverse
  File "zxbtrad.pyc", line 257, in traverse
  File "zxbtrad.pyc", line 1103, in traverse
  File "zxbtrad.pyc", line 257, in traverse
  File "zxbtrad.pyc", line 770, in traverse
  File "zxbtrad.pyc", line 375, in traverse
  File "zxbtrad.pyc", line 530, in traverse
AttributeError: 'SymbolSTRSLICE' object has no attribute '_mangled'


Por suerte, he podido usar la función asc definida en la biblioteca. Así sí funciona:

Código: Seleccionar todo

Sub terrainDraw (terrain As String)
   ' Draws a terrain based on heights in string terrain
   
   For i = 0 To 31
      y = asc (terrain, i) - 48
      For j = 0 To y
         If j < y Then
            Print At 21-j, i; Ink 3; Chr (105 + Int (Rnd * 2))
         Else
            Print At 21-j, i; Ink 4; "b"
         End If
      Next j
   Next i
End Sub


Si necesitas el código completo para hacer pruebas, te lo mando. Uso la última versión que hay en la web, la 1.2.6.

Otra cosa, ¿dónde puedo encontrar documentación y/o ejemplos sobre cómo pasar información entre BASIC y secciones asm? Necesito leer el valor de variables de BASIC dentro del código contenido en una sección asm/endasm.

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Lun Abr 19, 2010 9:15 am

Vuelve a descargártela, porque creo que ese error lo corregí anoche precisamente, y me dices. :P

Edito: Más info sobre ese error aquí: http://www.boriel.com/forum/viewtopic.p ... =430#p1119

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Lun Abr 19, 2010 9:45 am

Perfecto :) Luego te comento. Gracias.
Sobre lo de pasar info entre BASIC y ASM... ¿dónde puedo mirar cómo hacerlo? Estoy haciendo experimentos por mi cuenta pero consigo increíbles cuelgues :lol:

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Lun Abr 19, 2010 12:19 pm

Buenas, he instalado la última versión, siguiendo el enlace del foro que pusiste antes.

He utilizado esta linea de código:

Código: Seleccionar todo

pass = pass (1 To Len ((pass) - 1))


El compilador me dice que:

Código: Seleccionar todo

Traceback (most recent call last):
  File "zxb.py", line 255, in <module>
  File "zxb.py", line 197, in main
  File "ply\yacc.pyc", line 263, in parse
  File "ply\yacc.pyc", line 710, in parseopt
  File "zxbparser.pyc", line 3908, in p_len
KeyError: 'itring'

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Lun Abr 19, 2010 12:40 pm

También estoy teniendo problemas con la comparación de las cadenas. Debe haber algo que corrompe el espacio de cadenas, ya que en una función tengo este trozo de código:

Código: Seleccionar todo

   ' Check if Password is correct
   nPant = 0
   If pass = "FPOL" Then
      nPant = 12
   ElseIf pass = "ITYC" Then
      nPant = 17
   Else
      centra (22, "WRONG")
      Beep 1,0
   End If


Valga lo que valga "pass", si tiene 4 carácteres entra por la primera rama del IF y nPant vale 12, de hecho, si hago, dentro de mi código:

Código: Seleccionar todo

pass = "HOLA"
If pass = "CACA" Then
   Print "check!"
End If


Se imprime "check". pass está definido como String en la parte principal del código, y la malfunción ocurre en un Sub.

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Lun Abr 19, 2010 12:52 pm

na_th_an escribió:También estoy teniendo problemas con la comparación de las cadenas. Debe haber algo que corrompe el espacio de cadenas, ya que en una función tengo este trozo de código:

Código: Seleccionar todo

   ' Check if Password is correct
   nPant = 0
   If pass = "FPOL" Then
      nPant = 12
   ElseIf pass = "ITYC" Then
      nPant = 17
   Else
      centra (22, "WRONG")
      Beep 1,0
   End If


Valga lo que valga "pass", si tiene 4 carácteres entra por la primera rama del IF y nPant vale 12, de hecho, si hago, dentro de mi código:

Código: Seleccionar todo

pass = "HOLA"
If pass = "CACA" Then
   Print "check!"
End If


Se imprime "check". pass está definido como String en la parte principal del código, y la malfunción ocurre en un Sub.

Uish!... pero seguro que es la última versión...? a ver si he roto algo :!: Lo miraré en cuanto tenga un hueco.

Boriel
Sabreman
Mensajes: 351
Registrado: Lun May 28, 2007 9:55 am
Ubicación: Tenerife
Contactar:

Re: Un compilador de ZX Spectrum BASIC

Mensaje por Boriel » Lun Abr 19, 2010 1:03 pm

na_th_an escribió:Buenas, he instalado la última versión, siguiendo el enlace del foro que pusiste antes.

He utilizado esta linea de código:

Código: Seleccionar todo

pass = pass (1 To Len ((pass) - 1))


Ese código tiene un error de sintaxis (y el compilador, pese al error que muestras, te lo informa). El código correcto es:

Código: Seleccionar todo

pass = pass (1 To Len (pass) - 1)

na_th_an escribió:El compilador me dice que:

Código: Seleccionar todo

Traceback (most recent call last):
  File "zxb.py", line 255, in <module>
  File "zxb.py", line 197, in main
  File "ply\yacc.pyc", line 263, in parse
  File "ply\yacc.pyc", line 710, in parseopt
  File "zxbparser.pyc", line 3908, in p_len
KeyError: 'itring'

Sí, es un error del compilador, por no saber parar el error sintáctico y propagarlo. ¿Podrías comprobar si te compila con la corrección que te digo?

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Lun Abr 19, 2010 1:04 pm

Sí, creo que es la última versión. El instalador se llama "zxbasic-1.2.6r1542b.msi"

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Un compilador de ZX Spectrum BASIC

Mensaje por na_th_an » Lun Abr 19, 2010 1:09 pm

Vale, he puesto la corrección, y sí compila. Cuando pass sólo tiene un carácter e intento hacerlo se cuelga (porque estoy haciendo un "1 TO 0"), pero esto es normal (ayudaría que en estos casos se devolviese la cadena vacía, pero no importa). Gracias :)

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Ahrefs [Bot] y 12 invitados