close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 15 years ago

Closed 15 years ago

Last modified 14 years ago

#948 closed defect (remind)

Mecanismo sintáctico de restricción de paquetes

Reported by: Víctor de Buen Remiro Owned by: Víctor de Buen Remiro
Priority: highest Milestone: TOL Packages
Component: Kernel Version:
Severity: blocker Keywords:
Cc: Pedro Gea

Description

Los paquetes en TOL requieren que el NameBlock principal tenga una serie de miembros y métodos pero no hay actualmente ningún mecanismo que lo asegure antes de su publicación.

En función del resultado del ticket #947 hay que decidir si hacer los paquetes instancias de una clase base o de herencias ad-hoc o dejarlo como está, y que sea el TolPackage::Builder el que compruebe que está todo como debe ser.

Change History (4)

comment:1 Changed 15 years ago by Víctor de Buen Remiro

Cc: Pedro Gea added
Status: newaccepted

comment:2 Changed 15 years ago by Víctor de Buen Remiro

Tras la resolución positiva del ticket #947 se ha intentado crear un paquete como instancia de la clase

//////////////////////////////////////////////////////////////////////////////
//Clase base de la que se hereda los paquetes
Class @PackageBase
//////////////////////////////////////////////////////////////////////////////
{
  //Descripción breve en una línea
  Text _.autodoc.brief;
  //Descripción detallada
  Text _.autodoc.description;
  //i.e. http://packages.tol-project.org/OfficialTolArchiveNetwork/
  Text _.autodoc.url;
  //i.e. [["Palabras","Clave", ...]]
  Set  _.autodoc.keys;
  //i.e. [[ "fulanito@mail.tal", "menganito@mail.cual"]];
  Set  _.autodoc.authors;
  Text _.autodoc.minTolVersion =  Copy(TolReleaseId);
  //Sube cuando hay cambios de cierta envergadura
  //Mientras es cero se entiende que es una versión beta o en pruebas
  Real _.autodoc.version.high;
  //Sube ante cualquier cambio por pequeño que sea y baja a 1 ó 0
  //cuando sube _.autodoc.version.high
  //Cuando se tiene que probar alguna característica introducida en
  //nueva versión alta se le pone 0 a la baja
  Real _.autodoc.version.low;
  //i.e. [["paquete1","paquete2", ...]];
  Set  _.autodoc.dependencies;

  //El método de inicialización de acciones no decarativas será invocado
  //de forma automática por el #Require la primera vez que se le llame en
  //cada sesión TOL
  Real StartActions(Real void) { True }
};

pero da los siguientes errores

ERROR: [1] No se puede declarar un elemento estático sin definirlo en línea:
  Static Text _.autodoc.briefde Class @PackageBase

ERROR: [2] No se puede declarar un elemento estático sin definirlo en línea:
  Static Text _.autodoc.descriptionde Class @PackageBase

ERROR: [3] No se puede declarar un elemento estático sin definirlo en línea:
  Static Text _.autodoc.urlde Class @PackageBase

ERROR: [4] No se puede declarar un elemento estático sin definirlo en línea:
  Static Set _.autodoc.keysde Class @PackageBase

ERROR: [5] No se puede declarar un elemento estático sin definirlo en línea:
  Static Set _.autodoc.authorsde Class @PackageBase

ERROR: [6] No se puede declarar un elemento estático sin definirlo en línea:
  Static Real _.autodoc.version.highde Class @PackageBase

ERROR: [7] No se puede declarar un elemento estático sin definirlo en línea:
  Static Real _.autodoc.version.lowde Class @PackageBase

ERROR: [8] No se puede declarar un elemento estático sin definirlo en línea:
  Static Set _.autodoc.dependenciesde Class @PackageBase

El motivo es que los miembros especiales de documentación que son los que comienzan por _.autodoc. se consideran como estáticos incluso aunque no se declaren como tales porque no tiene mucho sentido que signifique una cosa distinta en cada instancia y de este modo se ahorra mucha memoria.

Para poder hacer los paquetes como instancias de clase simplemente habría que sustituir los prefijos _.autodoc. por otro cualquiera como _.package.

comment:3 Changed 15 years ago by Víctor de Buen Remiro

Resolution: remind
Status: acceptedclosed

En lugar de _.autodoc se ha usado el prefijo _.pkgdoc con lo que se ha solucionado el problema anterior.

Sin embargo ha aparecido otro problema distinto mucho más grave: no se pueden declarar tipos dentro de una istancia de clase, ni Struct ni Class

ERROR: [9] Sintaxis incorrecta en declaración de miembro
Struct @BysInf.Report.Config(Real raftery.diag.q_, Real raftery.diag.r_, Real raftery.diag.s_, Real raftery.diag.eps_, Real acf.lag_, Real histogram.parts_, Real kerDens.points_) de Class BysMcmc
ERROR: [10] Sintaxis errónea en el área de de miembros de declaración de [[
]]
Warning: [1] NameBlock BysMcmc se ha construido con 2 errores.
ERROR: [11] BysMcmc no se pudo crear.

Esta es una característica irrenunciable de los paquetes por lo que el cambio debería venir de ampliar las capacidades sintácticas de las clases. Para poder meter declaraciones en las instancias tendría que hacer cambios nada triviales. El problema es que de cada miembro lo único que se tiene a la hora de crear la clase es el trozo de árbol sintáctico que devuelve el parser con lo que cada cosa admisible tiene que tener su propio reconocedor que recorra esos árboles demenciales. El código ya es casi ilegible para mí por lo que intentar meter Struct y Class dentro de Class llevaría bastante esfuerzo, mucho más de lo que podemos soportar ahora mismo.

Por lo tanto la única solución viable por el momento es que sea el constructor de paquetes el que compruebe que están todos los miembros y métodos necesarios, para asegurar que al cliente le llegan paquetes correctos.

comment:4 Changed 14 years ago by Víctor de Buen Remiro

(In [2416]) refs #948
Clase base de la que deberían heredar los paquetes

Note: See TracTickets for help on using tickets.