Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
¿ Es Posible En Gambas Mapear Funciones En Una Colección ?
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje ¿ 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
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Lunes, 25 Noviembre 2013, 19:54; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Martes, 26 Noviembre 2013, 11:51; editado 3 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Es Posible Ejecutar Una Apĺiacion De Gamb... metalgearxd General 1 Miercoles, 06 Febrero 2013, 21:03 Ver último mensaje
jguardon
No hay nuevos mensajes ¿Es Posible Crear Extensiones De LibreOff... mrmister001 General 2 Lunes, 09 Diciembre 2013, 16:50 Ver último mensaje
jsbsan
No hay nuevos mensajes Es Posible En Gambas Crear Una Ventana Tra... v3ctor General 1 Domingo, 14 Diciembre 2014, 10:47 Ver último mensaje
jsbsan
No hay nuevos mensajes Al Final, Creo Que No Es Posible (¡Sí Er... shordi General 15 Sabado, 31 Octobre 2015, 20:30 Ver último mensaje
shordi
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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



  

 

cron