Codeblocks y punteros a funciones (Closures?)

Codeblocks y punteros a funciones (Closures?)

Postby xmanuel » Thu Dec 16, 2021 10:43 am

Los codeblock al ser un tipo de dato se pueden pasar como parámetros de funciones lo cual le da muchísima potencia a nuestros programas.
Fue una revolución el cambio de la macrocompilación por codeblocks.

En la época en que se creó el tipo de dato CodeBlock había muy pocos lenguajes que lo tuvieran... desde hace relativamente poco tiempo otros lenguajes lo han incorporado con el nombre de "Closures" o "funciones anónimas".
Pero incluso ahora con el uso de la clase Symbol se pueden hacer cosas muy chulas:

Code: Select all  Expand view  RUN

PROCEDURE Main()

   LOCAL oSym := Symbol():New( "QOUT" )

   ? "Now test the :Exec() method"

   oSym:Exec( "This string is being printed by QOUT" )
   oSym:Exec( "which is being invoked by the :Exec()" )
   oSym:Exec( "method in the Symbol class." )

   ?
   ? "symbol name: ", oSym:name

   ? "Comparing QOut symbol with xOut symbol"
   ? oSym:IsEqual( Symbol():New( "xOut" ) )

   ? "done!"
   ?

   RETURN
 



Y el no va mássssssssssss podemos usar punteros a funciones, lo cual va un paso más allá de los codeblocks:

Code: Select all  Expand view  RUN
procedure main()

    local pFunc := @alert()
   
    pFunc:exec( "Esto es una prueba de puntero a la funcion Alert()" )

    Alert( pFunc:name() ) // Devuelve el nombre de la funcion apuntada
   
    pFunc := @upper()

    pruebaPuntero( pFunc ) // Llama a una funcion pasando un puntero a funcion

 return

 procedure pruebaPuntero( p )

    alert( p:exec( "esto lo veras en mayusculas" ) )

 return
 


Harbour tiene muchos secretos que lo convierten en un lenguaje super potente y de futuro...
Te imaginas Harbour en la web?

Pues eso es posible con Mod_Harbour!!!
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 762
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: Codeblocks y punteros a funciones (Closures?)

Postby csincuir » Thu Dec 16, 2021 12:12 pm

Excelente Manu!
Esa no me la sabía, gracias! Lo pondré en practica en mis futuros códigos.

Saludos

Carlos
csincuir
 
Posts: 408
Joined: Sat Feb 03, 2007 6:36 am
Location: Guatemala

Re: Codeblocks y punteros a funciones (Closures?)

Postby Antonio Linares » Thu Dec 16, 2021 12:48 pm

El lenguaje C es el primero (que yo sepa) que habla de "punteros" que es una forma de decir "direcciones"

Un puntero apunta a algo. Una dirección es donde hay algo. El puntero apunta a un lugar, a una dirección, donde hay algo.
un bloque de código es una variable que apunta a un código, que contiene una secuencia de pcode.

La belleza de Clipper fué el establecer un paralelismo entre un lenguaje a muy bajo nivel (asm y lenguaje C) y otro a alto nivel, equilibrando perfectamente el "interior" (puro C) con el "exterior" (puro PRG)

Y Harbour simplemente siguió el camino marcado por Clipper 5 (Five). El estandard :-)

El 5 por numerología también hace referencia al conocimiento oculto, a lo que habia que aprender para construir un compilador. Algo que todos usabamos (los OBJs) pero desconociamos como se generaban. Tocaba y sigue tocando aprender...
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42122
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Codeblocks y punteros a funciones (Closures?)

Postby Joaquim Ferrer » Fri Dec 17, 2021 8:29 am

Enhorabuena por las explicaciones, realmente son temas que pueden 'marcar' un desarrollo, conocer estas utilidades 'indocumentadas'

Lamentablemente, harbour en temas 'avanzados' adolece de buena documentación a nivel de 'desarrollador de PRG'

Tener el codigo fuente (en C) no es garantía de documentación ya que muchas veces no llegaremos a descubrir realmente su funcionalidad

Explicar el tema de los punteros de la forma tan simple y pedagógica es de agradecer, tengo libros que casi en su totalidad dedican espacio a este tema y al final, aún estás más confundido que al inicio de la lectura

Una búsqueda en el repositorio de harbour, para obtener información de la clase Symbol me lleva a
Code: Select all  Expand view  RUN

 * Harbour implementation of Class(y) Class Symbol
 * Copyright 2003 Antonio Linares <alinares@fivetechsoft.com>
 */
#include "hbclass.ch"

CREATE CLASS Symbol
 


Que a su vez es un envoltorio de las funciones dynsym

Code: Select all  Expand view  RUN

   __dynsCount()
   __dynsGetName( nPos )
   __dynsGetIndex( "MAIN" )
 


Quizá para los que no tenemos memoria, nos podríais ilustrar qué significó Class(y) para el mundo xBase y como fué su aportación a Harbour

Saludos a todos y felices fiestas !
Fivewinner desde 1.9, programador PHP y Javascript, PWA & HTML5 evangelista
User avatar
Joaquim Ferrer
 
Posts: 105
Joined: Sat Jan 14, 2012 3:46 pm
Location: Barcelona

Re: Codeblocks y punteros a funciones (Closures?)

Postby Antonio Linares » Fri Dec 17, 2021 9:54 am

Cuando Clipper 5 apareció (algunos tuvimos la suerte de tenerlo antes, en mi caso mi buen amigo Carlos Segura me lo envió) descubrimos con sorpresa que podiamos crear y usar objetos pero Nantucket habia decidido no darnos aún la capacidad de crear y usar nuevas clases. Esto era realmente frustrante :-)

Dentro de las librerías de Clipper, el módulo "osend" (creo recordar) era el Santo Grial por descifrar. Anton Van Straaten desde sudAfrica vió la oportunidad de negocio y comenzó a construir Class(y). Yo le llamé por teléfono e intenté que entendiese la importancia de dar un módulo runtime gratis para todos. Todos teniamos que crear y usar nuevas clases y era la única forma que todos pudiésemos usarlas de forma general. El me ignoró rotundamente :-D Algo que años más tarde sucedería exactamente igual con Stephen Pirsig, lider de xBase++.

En aquel entonces aun no había internet. Solo las BBSs y CompuServe. Y un buen dia, por arte de magia, en las BBSs, apareció un módulo sin nombre, ni autoria, nada... que para sorpresa de todos permitía usar el módulo indocumentado "osend" de Clipper 5. Aquello fué un antes y un después. Libertad para programar con nuevas clases y sin tener que pasar por caja obligatoriamente...

Mi buen amigo Francisco Pulpón lo estudió a fondo, obsesionado en conseguir la máxima velocidad, y asi nació la librería "objects" que se usó para construir FiveWin. Ya no hacia falta Class(y). De hecho no estabamos de acuerdo con determinadas claúsulas usadas por Class(y). Querian usar "INSTVAR" cuando lo más lógico era "DATA". Introdujimos las nuevas cláusulas INLINE (algo que venia de C++, los métodos inline), VIRTUAL, BLOCK, etc. y decidimos llevarlo a Clipper.

El código fuente inicial de "objects" fué donado para Harbour y fué completado por muchos colaboradores en el desarrollo de Harbour. Y es el que usamos todos cada dia de forma libre en nuestra grandiosa comunidad de usuarios Harbour.

Harbour nos sobrevivirá a todos los Clipperos de corazón y Harbourianos. Libertad, solidaridad, transparencia... ese es nuestro legado. Esta es la grandeza de lo que hemos construido entre todos :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42122
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Codeblocks y punteros a funciones (Closures?)

Postby hmpaquito » Fri Dec 17, 2021 12:15 pm

Y un buen dia, por arte de magia, en las BBSs, apareció un módulo sin nombre, ni autoria,

La magia existe, lo hemos visto en esta bonita historia de Navidad


Pues no se me ocurre como usar la clase Symbol o los punteros a funciones... Debo estar oxidado
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Codeblocks y punteros a funciones (Closures?)

Postby Antonio Linares » Fri Dec 17, 2021 12:23 pm

Paco,

> Pues no se me ocurre como usar la clase Symbol o los punteros a funciones... Debo estar oxidado

Esa clase la escribí simplemente para demostrar que podiamos tenerla igual que Class(y) la tenía

pero, igual que tú, nunca le encontré una utilidad :-)

Pero quien sabe, cuando de repente pueda ser parte de un puzzle aun por resolver ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42122
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 60 guests