lenguaje-latino / latino

Lenguaje de programación de código abierto para latinos y de habla hispana.
http://lenguajelatino.org/
Other
466 stars 51 forks source link

Pila vacia #212

Open guizans opened 1 year ago

guizans commented 1 year ago

Reportando bug

no escribir en esta área y marcarlo al completar el issue.

no escribir en esta área y marcarlo al completar el issue.

Más detalles:

Hola. Cuando ejecuto este código, el imprimir siempre me imprime falso, y después me marca error de Pila vacia. Estoy usando la versión 1.4.1 en Fedora.

Muchas gracias.

Código en donde ocurre:

// código_aquí
repetir
    imprimir("Escribe un número entre el 1 - 20: ")
    x = leer()
    imprimir(x)
    y = anumero(x)
hasta(y==10)
FrkL81 commented 1 year ago

Hola guizans,

Yo utilizo Windows y me ocurre igual. Sin embargo, el error ocurre creo, por tu elección del ciclo "repetir --- hasta". El manual de latino dice que:

Si no se incrementa el valor de una variable contadora este bucle se repetiría infinitamente sin parar, produciendo un error en la memoria.

Por lo que entiendo que la condición debe comprobarse contra un contador.

Quizás utilizando un ciclo "mientras" logres tu objetivo:

conmutador = falso
contador = 0
x = 0
y = 10

mientras (conmutador == falso)
    limpiar()
    imprimir("Escribe un número entre el 1 - 20: ")
    x = leer()
    si (y == x)
        conmutador = verdadero
    fin
    contador++
fin

imprimir ("El número es " .. y .. " y lo adivinaste en " .. contador .. " intentos.")
leer()

En esta lógica utilizo un contador solo para llevar la cuenta de las veces que se introduce un número. El ciclo se repetirá mientras el dato introducido sea diferente del valor inicializado en la variable "y", en tu caso 10.

Espero esto te ayude.

guizans commented 1 year ago

Hola FrkL81

Tu código es una opción para salvar el escollo. Pero creo que si que es un bug, ya que a pesar de no tener un contador, por lo menos tendría que hacer un bucle, ya que como tu dices que aparece en la documentación: Si no se incrementa el valor de una variable contadora este bucle se repetirá sin parar y este no es el caso, ya que solo se repite una vez. Eso y si ejecutas el código verás que el problema viene dado con el valor de x, ya que en vez de almacenar la entrada de consola, siempre imprime con falso, con lo cual no tiene sentido, y sólo lo hace si está dentro del bucle. Un saludo.

MelvinG24 commented 1 year ago

@guizans, el problema es que estas comparando una variable a la cual no estas declarado antes de la funcion sino que dentro de la funcion... Trata con declarar la variable y antes de entrar al loop

guizans commented 1 year ago

Hola MelvinG24.

y = 5
x = ""
repetir
    imprimir("Escribe un número entre el 1 - 20: ")
    x = leer()
    imprimir(x)
    y = anumero(x)
        imprimir(y)
hasta(y==10)

Pues lo he probado así y me da el mismo error. El problema creo que es la asignación de la función leer(), ya que el primer imprimir(x) me da falso y da igual lo que introduzca por teclado. Y el segundo imprimir(y) me pone que es nulo, ya que 'x' no tiene nada dentro y no puede hacer una conversión, y es normal que el bucle de error, ya que la variable 'y' está vacia.

Un saludo.

FrkL81 commented 1 year ago

Saludos MelvinG24, guizans,

Ahora creo que el análisis de @guizans es correcto. En la respuesta que me redactó anteriormente está el punto donde ocurre el error, que es al tratar de asignar a la variable x un valor desde la consola. Al parecer no se puede hacer esto correctamente dentro del Loop -repetir ... hasta-

y = 5
x = 0
x = leer()

repetir
    imprimir("Escribe un número entre el 1 - 20: ")

    imprimir(x)
    y = x
        imprimir(y)
hasta(y==10)

Al sacar la asignación fuera del Loop, si se introduce un valor distinto al requerido en la condición, se produce el error que si es esperado según la documentación.

Me agradó ver algo de interacción por aquí ... espero siga así y que esto ayude a evolucionar el lenguaje más rápido. Un cordial saludo a todo el que lea esto. Sigan apoyando este genial lenguaje ...

guizans commented 1 year ago

Hola FrkL81

He estado probando el código tal como lo has publicado, pero en tú código hay un problema que es lógico, ya que la variable x e y son una cadena de carácteres y por lo tanto el bucle da el error esperado. Hasta ahí todo correcto. Pero si haces como en el código original, que llamo a la función anumero() para hacer la conversión de una cadena de caracteres a una variable numérica, la función imprimir(y) me imprime falso, aun poniendo la función leer() fuera del bucle. Es como si dentro del bucle no funcionasen las funciones o tienen un comportamiento erróneo. Da la sensación de que solo funciona la función imprimir().

Ojalá este lenguaje evolucione, me gusta. Mis mas sinceras felicitaciones a los desarrolladores que estarán haciendo lo que pueden con muy pocos recursos.

Un saludo.

FrkL81 commented 1 year ago

Hola guizans,

Si, veo lo que dices, sin embargo, ese error debe ser provocado por algo diferente al tipo de dato. Si te fijas en el primer código que escribí en este hilo de comentarios, hice una comparación de una variable introducida por consola en tiempo de ejecución, con otra numérica escrita en el código sin hacer una conversión del tipo de dato y funciona.

No he comprobado en la documentación, pero creo que se puede apreciar que Latino es un lenguaje dinámicamente tipado. Lo que quiere decir que, el lenguaje en la mayor parte de los casos determina en tiempo de ejecución el tipo adecuado para cada variable.

Por ejemplo:

limpiar()
num1 = 0
num2 = 0
imprimir ("Introduce el primer número:")
num1 = leer()

imprimir ("Introduce el segundo número:")
num2 = leer()

    imprimir ("La suma es: " .. num1 + num2)

    imprimir ("La concatenación es: " .. num1 .. num2)

leer()

Para la suma se determina en tiempo de ejecución que los datos son de tipo numéricos. Para la concatenación se determina que son del tipo cadena de caracteres.

... Saludos

guizans commented 1 year ago

Hola FrkL81

Si, veo que Latino es un lenguaje dinámicamente tipado, lo cual lo vuelve fácil. Me he dado cuenta en mi código que la función anumero() se puede precindir de ella. Pero el error persiste.

Un saludo.