¿ Es Posible En Gambas Mapear Funciones En Una Colección ?


Objetivo: ¿ Es Posible En Gambas Mapear Funciones En Una Colección ?
Hola!.

Antes de nada tomemos el termino función tanto como para función como para procedimiento. Ok ?.
Fijaros en este ejemplo: (Lo se, he vuelto a usar un proyecto de formulario..jeje)


Public Sub Form_Open()

Dim d As New Collection

d.Add(f(), 0)

Print d[0]

End

Public Sub f() As String

Return "Hola"

End



Si el procedimiento o función f, hubiera sido un procedimiento (al no devolver valor, daría error). Función que no tiene parámetros, en este caso.
Pero devuelve un tipo cadena. En cambio al ser una función que devuelve valor y usar el comando Print, nos muestra el valor que devuelve la función f.

Hemos añadido el nombre de la función a la colección, el valor es el nombre de la función y su clave es 0.
No puedo ejecutar a secas en Gambas: (Si hubiera sido un procedimiento en vez de una función que devuelve valor.

d[0]

Tampoco puedo añadir....
d[0]()

(lo se, esto es de Python).

Es algo que estoy viendo en un vídeo del curso de Python y estaba viendo si podíamos implementar eso para Gambas

Añado, como veis no he podido poner f como valor, si no f() como función o procedimiento en la colección.

Saludos

última edición por Shell el Lunes, 25 Noviembre 2013, 19:54; editado 1 vez
Objetivo: Re: ¿ Es Posible En Gambas Mapear Funciones En Una Colección ?
Este es un ejemplo parecido pero en Python:

Ademas, añadimos el parámetro nombre. Como lo hice en gambas,
para que veáis la diferencia con respecto a Python.

def saludar(nombre):
print "Hola "+nombre

# Diccionario, en gambas hemos usado colección
d = {0:saludar}

# Llamamos a la función y ademas le pasamos un parámetro.
d[0]("Juan")



Cuando termine de bajar la actualización de gambas lo pruebo con parámetro en Gambas.
Aja...complicado, parece ser.

Saludos

Objetivo: Re: ¿ Es Posible En Gambas Mapear Funciones En Una Colección ?
"Mapear funciones" no es un término que me suene de nada.

Lo que en tu código pretendes es meter la llamada a una función dentro de una colección. Eso no es posible, que yo sepa. El contenido de la colección ha de ser conocido en tiempo de compilación. En ejecución ya debe estar todo resuelto (hasta donde yo se) por tanto no es posible hacer eso directamente.

Si haces esto
dim cad as string

cad="Pepe"

d.Add(f(cad), 0)

Print d[0]

cad="Juan"

print d[0]


End

Public Sub f(nombre as string) As String

Return nombre



Verás que imprime "Pepe" las dos veces, a pesar de cambiar el valor de la variable.

Perfil MP  
Objetivo: Re: ¿ Es Posible En Gambas Mapear Funciones En Una Colección ?
shordi escribió: [Ver mensaje]
"Mapear funciones" no es un término que me suene de nada.


Esta es la frase que muestra parte del tutorial donde lo explicaba. En inglés, claro.
Citar:

# Illustration of a dictionary mapping values to functions

La colección de gambas tiene hasta cierto parecido al diccionario.
Es mapear números a funciones. Un índice.

shordi escribió: 
Verás que imprime "Pepe" las dos veces, a pesar de cambiar el valor de la variable.

Si, eso no puede cambiar. Solo la primera vez y mucho es.

Así que lo he hecho de esta forma:

Public Sub Main()

Dim d As String
Dim anombre As New String[1]
Dim nombredefunciones As String[] = ["Saludar", "Despedir"]

anombre[0] = "Juan"

Print Object.Call(Me, nombredefunciones[0], anombre)
Print Object.Call(Me, nombredefunciones[1], anombre)

End

Public Sub Saludar(nombre As String) As String

Return "Hola " & nombre

End

Public Sub Despedir(nombre As String) As String

Return "Adios " & nombre

End


Aquí la cosa es que le tienes que pasar como parámetro un array. Habría que ver como pasar otro nombre, pues como no sea creando un array de arrays..
U otra variable.


Saludos

última edición por Shell el Martes, 26 Noviembre 2013, 11:51; editado 3 veces
Objetivo: Re: ¿ Es Posible En Gambas Mapear Funciones En Una Colección ?
Bueno... vale. Pero no deja de ser utilizar algo para un uso que no está pensado.

Esos retorcimientos, a veces funciona de maravilla, pero cuando menos, son engorrosos.

Hay otras formas de pelar el mismo gato mucho más simples y adecuadas al lenguaje.

Opino.

Perfil MP  
Objetivo: Re: ¿ Es Posible En Gambas Mapear Funciones En Una Colección ?
Si, comprendo. Es cuestión de buscar un camino alternativo.

Al final he visto como solucionar el problema. He retocado el código de arriba.

Public Sub Main()

Dim nombredefunciones As String[] = ["Saludar", "Despedir"]
Dim anombre As New String[]

anombre.Add("Juan")
anombre.Add("Antonio")

Print Object.Call(Me, nombredefunciones[0], [anombre[0]])
Print Object.Call(Me, nombredefunciones[1], [anombre[0]])

End


Desde luego hay que usar lo mas adecuado para cada lenguaje.
En este caso, podíamos tener una lista larga de funciones y en el array nombredefunciones, ver rápidamente los nombres de todas estas
y no tener que estar navegando por el código. Otra cosa es los parámetros que tengan que tener.

Hay que buscar la forma mas cómoda de hacer algo. También la de hacerla mas legible para cualquiera que quiera interpretar nuestro código.
Podemos reducir el código hasta cierto nivel y solo el que tenga una experiencia mayor podrá hacerlo mejor. No lo vemos a la primera y
a veces ni nos preocupamos.

Hay otras que hacemos lineas de código enorme. Nuestro código llega a ser realmente complicado de entender.
Hay que buscar remedios e ir mejorando, etc.

Saludos

Objetivo: Re: ¿ Es Posible En Gambas Mapear Funciones En Una Colección ?
Interesante. Hay un ejemplo de uso práctico de Object.Call() en el ejemplo que viene con gambas "Paint".

http://gambasdoc.org/help/comp/gb/object/call?es&v3

Saludos

Perfil MP  
Objetivo: Re: ¿ Es Posible En Gambas Mapear Funciones En Una Colección ?
Algo mejor. Recordando que no es una colección, es un array.

Private lista_de_funciones As String[] = ["Saludar", "Despedir"]

Public Sub Main()

LLamarFunciones("Juan")

End

Public Sub LLamarFunciones(nombre As String)

Print Object.Call(Me, lista_de_funciones[0], [nombre])
Print Object.Call(Me, lista_de_funciones[1], [nombre])

End
.
.
.


Y aun se puede rizar un poco mas la función de llamada:

Public Sub LLamarFunciones(nombre As String)

Dim nombre_funcion As String

For Each nombre_funcion In lista_de_funciones
Print Object.Call(Me, nombre_funcion, [nombre])
Next

End


Saludos


Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.3991s (PHP: -73% SQL: 173%)
Consultas SQL: 47 - Debug off - GZIP Activado