FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Codeblocks y punteros a funciones (Closures?)
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Codeblocks y punteros a funciones (Closures?)
Posted: 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 (fw): Select all Collapse
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 (fw): Select all Collapse
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
Posts: 476
Joined: Sat Feb 03, 2007 06:36 AM
Re: Codeblocks y punteros a funciones (Closures?)
Posted: 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

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Codeblocks y punteros a funciones (Closures?)
Posted: 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
Posts: 105
Joined: Sat Jan 14, 2012 03:46 PM
Re: Codeblocks y punteros a funciones (Closures?)
Posted: Fri Dec 17, 2021 08: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 (fw): Select all Collapse
聽* 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 (fw): Select all Collapse
聽 聽__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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Codeblocks y punteros a funciones (Closures?)
Posted: Fri Dec 17, 2021 09: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
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Codeblocks y punteros a funciones (Closures?)
Posted: 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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Codeblocks y punteros a funciones (Closures?)
Posted: 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

Continue the discussion