(https://i.imgur.com/Z0cblp5.jpg)
Estuve jugando un poco con el pre compilador y me gustó como quedó. Es parte del codigo que estamos abriendo de Anarkade en forma de librerias. si quieren ir echando el ojo: https://bitbucket.org/pixelatom/bennu_framework/src/d42bb583a9b664a1f1a659d3529c57453a4b233c/test_menus/test_menus.prg?at=master
Interesante.
Lo cierto es que Bennu, y Fénix... y DIV, llevaban pidiendo algo similar desde hace mucho :D
En otros lenguajes orientados a objetos es más sencillo porque ya implementan los métodos de clase, pero aquí son procesos independientes. Por lo que entiendo, esto son una especie de "eventos pasivos" ¿no? Es decir, el proceso se ejecuta y comprueba en su ejecución si se ha producido un evento ¿no?
Aunque no sé, yo lo hubiera enfocado a ejecutar un trozo de código al mandarle el evento directamente al proceso, similar al onexit o algo así. Quiero decir que se le mande un "signal" a un proceso y este ejecute el trozo que corresponde a esa señal.
En cualquier caso, es interesante, y no habría que hacer algunas "cabriolas" para esto mismo :D Tratar de hacer un IDE sin eventos es complicado, aunque no imposible.
Se ve muy MUY interesante ese framework :D
Gracias Gecko! Ya voy a documentarlo y prepararlo para publicarlo. Mientras tanto hay cosas que ya funcionan bien y venimos usando hace mucho. Cómo la librería de controles, que yo creo es muy útil tanto para permitir configuración de controles o soporte multiplataforma.
Drumpi la verdad es que consideré la posibilidad de hacerlo como tú dices, pero al final me incliné por la opcion más práctica y simple de implementarlo, veremos cómo anda, siempre se puede refactorear :P
ayer un poco apurado me costo ver lo que intentabas hacer... hoy lo entendi...
no se si lo que has hecho es lo mas simple, creo que lo que dice Drumpi es mas simple, por otro lado, quizas incluso podrias haberlo hecho de forma de libreria sin tener que tocar el compilador, haciendo funciones que armen el handler del evento y un frame callback que ejecute el evento llamando a una funcion...
por ejemplo...
process blah()
begin
on_event(EVT_UI_FOCUS, my_function_handler)
end
function my_function_handler(e)
begin
....
end
asi no tendrias que tocar el compilador y quedaria una libreria que puede ser facilmente portada como modulo a cualquiera de los bennu like...
como sea, muy bien te has atrevido a tocar el compilador y implementar un nuevo comando...
No no, nunca toque el compilador, lo que hice fue usar el precompilador.
Claro que lo que propones vos es mucho mejor implementación, pero con el pre compilador no se puede hacer
precompilador?
Si, no se si le estoy diciendo bien, estoy usando #define
ahh... me imagine... preprocesador... :D
jejeje, ahora si... muy bien entonces, genial...
ahi vi tu codigo, lo podrias optimizar asi...
#ifndef __EVENTS
#define __EVENTS
import "mod_proc";
local
__event_code = 0;
end
/**
* Events are process that last one frame only
*/
process __event(int event_code)
begin
priority = 255;
__event_code = event_code;
frame;
end
#define event_trigger(event_code) __event(event_code);
#define event_on(event_code,e) while (e=get_id(type __event)) if (e.__event_code != event_code) continue; end;
function event_get_process(e)
begin
return e.father;
end
function event_get_process_type(e)
begin
return e.father.reserved.process_type;
end
function event_get_code(e)
begin
return e.__event_code;
end
#endif
Gracias! Había probado eso, pero por alguna razón dio error, dice que el tipo de proceso event no es conocido, por eso tuve que usar get_id(0)
ahora tambien lo dice?, quizas te falto el __ ? o falla eso?
tambien podrias declarar
__event_code como public dentro de __event, y declaras e como __event en las funciones donde la usas... con eso ahorrarias memoria, y seria mas ordenado, de otra forma cada proceso tiene __event_code declarado como local y no lo usa.
y ahora volviendo a ver el codigo, incluso deberia funcionar esto
process __event(int __event_code)
begin
priority = 255;
frame;
end
Muchas sugerencias copadas pero realmente no se pueden implementar como decis, vamos por parte y te explico cada una:
process __event(int __event_code)
begin
priority = 255;
frame;
end
Si declaramos __event_code como publica, el compilador da error que la variable está redeclarada (inclusive usando declare)
e=get_id(type __event)
Quote
ahora tambien lo dice?, quizas te falto el __ ? o falla eso?
Efectivamente falla, el error textual es: error:
Unknown identifier ( token error: "TYPE__EVENT" ).Saludos!
perdon, pero a mi no me da esos errores
si la declaras como publica, hay que hacer la asignacion como tenias antes, pero funciona
#ifndef __EVENTS
#define __EVENTS
#if __BGD__ == 2
import "mod_misc";
#else
import "mod_proc";
#endif
declare process __event(int event_code)
public
int __event_code = 0;
end
end
/**
* Events are process that last one frame only
*/
process __event(int event_code)
begin
priority = 255;
__event_code = event_code;
frame;
end
#define event_trigger(event_code) __event(event_code);
#define event_on(event_code,e) while (e=get_id(type __event)) if (e.__event_code != event_code) continue; end;
function event_get_process(__event e)
begin
return e.father;
end
function event_get_process_type(__event e)
begin
return e.father.reserved.process_type;
end
function event_get_code(__event e)
begin
return e.__event_code;
end
#endif
#include "events.inc"
begin
end
splinter@splinter-C500:~/bennugd.test/events$ bgdc sample.prg
BGDC 2.0.0 (Aug 1 2017 19:45:03)
Bennu Game Development Compiler
Copyright (c) 2006-2016 SplinterGU (Fenix/BennuGD)
Copyright (c) 2002-2006 Fenix Team (Fenix)
Copyright (c) 1999-2002 José Luis Cebrián Pagüe (Fenix)
File sample.dcb compiled (35560 bytes):
Processes 5
Global data 568 bytes
Local data 120 bytes
Private data 32 bytes
Public data 8 bytes
Code 280 bytes
System processes 132
Globals vars 6
Locals vars 8
Private vars 4
Publics vars 1
Identifiers 372
Structs 4
Strings 4 (30 bytes)
veo que dice TYPE__EVENT, estas poniendo todo junto... es TYPE <ESPACIO> __EVENT
Qué raro, será la versión del compilador?
Quote from: SplinterGU on December 18, 2017, 03:24:35 PM
veo que dice TYPE__EVENT, estas poniendo todo junto... es TYPE <ESPACIO> __EVENT
No no, no soy tan nabo Jaja, lo pongo separado
Quote from: JaViS on December 18, 2017, 04:14:23 PM
Quote from: SplinterGU on December 18, 2017, 03:24:35 PM
veo que dice TYPE__EVENT, estas poniendo todo junto... es TYPE <ESPACIO> __EVENT
No no, no soy tan nabo Jaja, lo pongo separado
jaja, bueno, se lee pegado, debio ser el copy&paste.
no deberia ser el compilador, probaste nuevamente con el codigo que puse?
Quote from: SplinterGU on December 18, 2017, 04:16:38 PM
Quote from: JaViS on December 18, 2017, 04:14:23 PM
Quote from: SplinterGU on December 18, 2017, 03:24:35 PM
veo que dice TYPE__EVENT, estas poniendo todo junto... es TYPE <ESPACIO> __EVENT
No no, no soy tan nabo Jaja, lo pongo separado
jaja, bueno, se lee pegado, debio ser el copy&paste.
no deberia ser el compilador, probaste nuevamente con el codigo que puse?
Nope, no es el copypaste, es el error literal como sale por consola, sale asi junto, a pesar de que yo lo escribo por separado. Pasa tambien con un solo guión, pero acabo de comprobar que sacandole los guiones funciona bien
raro, intrigado que puede ser que con guiones no funcione... imagino que estas usando bennugd oficial? o algun fork?
Quote from: SplinterGU on December 18, 2017, 04:57:34 PM
raro, intrigado que puede ser que con guiones no funcione... imagino que estas usando bennugd oficial? o algun fork?
bennugd oficial, a proposito, quizas a vos tambien te da el mismo error, proba llamar la funcion event_on en tu ejemplo, a mi me lo da en esa linea
Perdón, el error tambien ocurre sin guiones bajos.
Quote from: JaViS on December 18, 2017, 05:06:55 PM
Quote from: SplinterGU on December 18, 2017, 04:57:34 PM
raro, intrigado que puede ser que con guiones no funcione... imagino que estas usando bennugd oficial? o algun fork?
bennugd oficial, a proposito, quizas a vos tambien te da el mismo error, proba llamar la funcion event_on en tu ejemplo, a mi me lo da en esa linea
es cierto... bueno, ya lo revisare luego.
gracias!
fixeado! muchas gracias!
por favor, en lugar de hacer un "workaround" para salir del paso, reportar estos errores... no teman preguntar, aunque parezca estupida la pregunta...
asi podemos depurar bien el producto.
nuevamente, muchas gracias!
Buenísimo, voy a probar implementar los cambios que propones de vuelta y te cuento como me fué
los cambios del fix, lo subi al svn, voy a esperar a revisar algunas cosas mas antes de generar el binario... pero ese bug ya esta resuelto.
puedes generar los binarios si quieres.