""En mi opinión, la generación de código está bien para crear el esqueleto de un proyecto. Pero más allá, la posibilidad de regenerar el código después implica que no debe alterarse ese código generado, lo que supone una sobrecarga en la especialización de clases. """
Este es un problema que he solucionado con tokens poniendolos en la parte donde va el codigo generado, Python busca dónde insertar código para no afectar el código ya hecho, requiere un poco de trabajo pero ha funcionado bien, el problema es que es mucho trabajo para cada caso. Tambi'en separo lo m'as que se puede del c'odigo que podr'ia ser insertado manualmente. Despu'es de investigar un poco creo que este post es la forma m'as robusta de generar codigo con python http://szelei.me/code-generator/ Usando LLVM Creo que es una idea muy elegante pero el problema no es [ python --> template --> algun_lenguaje ] sino [ algun_lenguaje ---> template ] ( no es un proceso reversible ). Lo que si se podr'ia hacer es hacer un registro que de c'odigo de bloque de jinja2 genero que parte de codigo de c++, y as'i saber donde localizar el nuevo c'odigo en el template. No es trivial pero tampoco es una odisea, adicionalmente podr'ias indicar en jinja2 secciones de "c'odigo de usario" donde normalmente se espera, as'i si alguien quiere actualizar su codigo generado esas partes jam'as se toquen y los otros "conflictos" tratar de resolverlos automaticamente de lo contrario manual. Lo malo es que la 'unica manera sin meter mucho parsing es usar tokens al inicio y final de cada parte en forma de comentario en c++ as'i python identificar'ia facilmente que parte corresponde a que //Auto-generated code file: generator.py block: block_of_inputs //Do not edit the lines below ... // End of auto-generated code file: generator.py block: block_of_inputs // User code file: generator.py block: user_logic_driver ... // End of user code file: generator.py block: user_logic_driver Pongo c++ pero podr'ia ser para cualquier lenguaje, por eso me atrevo a ponerlo aqu'i. Saludos On Wed, Apr 17, 2019, 2:53 AM Chema Cortes <pych...@gmail.com> wrote: > > El mar., 16 abr. 2019 a las 22:43, AGTUGO (<agt...@gmail.com>) escribió: > >> Hola lista de python, >> >> Realmente no se si es offtopic, pero despu'es de auto-generar c'odigo con >> python para varios lenguajes (entre ellos c++, c, makefiles, Corba IDL, >> etc.) uno se pregunta si se puede automatizar m'as. >> Actualmente utilizo python para parsear codigo c y c++ con ayuda de >> librer'ias, para usarlos como input y generar c'odigo (c++, IDL) usando >> templates, yo en particular uso JINJA2, siento que es lo suficientemente >> simple para no complicar demasiado los templates, no tengo ninguna >> preferencia pero me parece descente. Ahora me gustar'ia no usar templates >> si no hacer un framework para facilitar la creacion de codigo c++. >> > > La metaprogramación se usa, normalmente, para facilitar la creación y > mantenimiento de código. Distinguiría algunos tipos: > > - abstracciones: por ejemplo, los ORMs que generan internamente código > SQL (eg: alchemy) > - generadores: como SIP que genera *bindings* para conectar python con > librerías C/C++ > - transpiladores: como typescript cuyo compilador genera código para > varias versiones de javascript > - macros: expansiones del lenguaje como los macros que tiene rust > - DSL (*domain-specific language*): aunque no es metaprogramación, se > parece. Son comunes en ruby o lua. > > Sin duda los transpiladores para javascript son los más usados hoy en día. > Para python podría destacar coconut que puede generar código python para > py2, py3 y pypy. También hay generadores de código C para crear extensiones > python como cython o pyrex. > > >> >> http://lua-users.org/wiki/CppMetaprogramming #Esto es el ejemplo en lua >> de metapromacion >> >> He usado un poco de lua para experimentar como lo muestra el link, lo >> cual me parece excelente. A pesar de que lua es un gran lenguaje, la >> integraci'on con algunas herramientas en mi caso espec'ifico es una labor >> titanica, me pregunto si hay alguien que este haciendo algo as'i aqu'i o >> conozcan algo similar para python, en cualquier lenguaje. Ahora algunas >> cosas que he hecho en python en modo de experimentaci'on es definir la >> estructura de mi proyecto, y el codigo que conecta todo antes de empezar a >> escribir todo es auto-generado, no me tengo que preocupar de que las cosas >> no esten conectadas y dise;o pruebas genericas para probar las interfaces >> desde antes. >> > > Sin ninguna duda, lua es el mejor lenguaje para metaprogramación. > Desconozco qué herramientas se puedan usar con lua, pero me temo que no es > un lenguaje suficientemente popular. Seguramente tengas más suerte con > algún lenguaje *lispoide *como scheme o racket (mírate fulmar para > racket). > > > >> Saben si esta pr'actica es com'un? me parece una forma natural de >> trabajar con lenguajes est'aticos, si cambio el nombre de un archivo no me >> tengo que preocupar de cambiarlo en todos los lugares donde esta >> referenciado, el esqueleto del proyecto se hace al inicio y se hace m'as >> f'acil a;adir la l'ogica despues, a'un tengo problemas por solucionar pero >> se va facilitando con el tiempo. >> >> Realmente me recuerda a algunas IDEs pero con la ventaja de que es mucho >> m'as personalizable. >> >> > En mi opinión, la generación de código está bien para crear el esqueleto > de un proyecto. Pero más allá, la posibilidad de regenerar el código > después implica que no debe alterarse ese código generado, lo que supone > una sobrecarga en la especialización de clases. En el mantenimiento son más > recomendable usar las herramientas de refactorización ya incorporadas en > algunos IDEs. > > Herramientas para generar el esqueleto de un proyecto hay muchas. Por > nombrar algunas: angular-cli para aplicaciones angular, giter8 para > proyectos scala o pyscaffold para python. Así mismo, muchos frameworks > incluyen sus propios generadores (eg: django). > > Un último consejo: dale una oportunidad a rust y sus macros como > alternativa a C++. > > Saludos. > > > -- > Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": > https://blog.ch3m4.org > Buscador Python Hispano: http://busca.ch3m4.org > <https://blog.ch3m4.org/pages/busqueda-python-es/> > _______________________________________________ > Python-es mailing list > Python-es@python.org > https://mail.python.org/mailman/listinfo/python-es >
_______________________________________________ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es