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 14 years ago

Closed 14 years ago

Last modified 14 years ago

#1307 closed defect (fixed)

Can't use a class @InputDef defined within a NameBlock

Reported by: Jorge Owned by: Víctor de Buen Remiro
Priority: normal Milestone: Mantainance
Component: Kernel Version: 2.0.1
Severity: normal Keywords:
Cc: cperez@…, Pedro Gea

Description

NameBlock nb = [[
  Class @InputDef {
     Real a = 1
  }
]];

nb::@InputDef ll = [[ Real a = 1 ]];

generate the following error messages

ERROR: [1] Cannot apply structure@InputDef having 2 fields to a set with 1 elements

ERROR: [2] Cannot apply structure @InputDef

ERROR: [3] A set with structure @InputDef was expected instead of Set ll

The class is correctly defined but I'm no able to use it.

Change History (11)

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

Status: newaccepted

Parece que está confundiéndose con la estructura @InputDef definida en C++.
Intentaré ver cómo arreglarlo.

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

Ya está localizado el problema aunque la solución no es trivial. Espero poder tenerlo resuelto el lunes.

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

(In [3757]) Refs #1307

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

Resolution: fixed
Status: acceptedclosed

(In [3759]) Fixes #1307

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

(In [3760]) Refs #1307
Setting VERSION_BUILD "0.15.alpha"

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

(In [3761]) Refs #1307
Removing old source

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

(In [3763]) Fixes #1307

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

Resolution: fixed
Status: closedreopened

Se ha detectado un problema en la carga de paquetes con clases relacionado con este ticket

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

Resolution: fixed
Status: reopenedclosed

(In [3764]) Fixes #1307

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

Durante la creación de un NameBlock nb si se predeclara una clase Class @cls no se puede añadir como miembro porque no es un objeto real, lo que hay es un mero símbolo que se añade temporalmente al ámbito global. Cuando finalmente se declara la clase, se crea ya como miembro y se destruye el símbolo de predeclaración.

El viejo reconocedor de tipos de usuario siempre reconocía la expresión nb::@cls pues, por error, cualquier símbolo global era visible, y por eso daba el problema originario de este ticket, ya que se busca primero como Struct y luego como Class.

Sin embargo el nuevo sistema sólo tiene en cuenta los miembros del NameBlock y es por tanto incapaz de reconocer una clase predeclarada dentro de un NameBlock. La única solución posible, y lo es sólo parcialmente, es que si no se encuentra el miembro especificado se permita buscar entre las clases predeclaradas, que son siempre globales y dar por hecho que será declarada dentro del NameBlock.

Para evitar conflictos se debe evitar predeclarar clases fuera de un NameBlock, pues en tal caso esos símbolos quedarían inutilizables para ser predeclarados en cualquier NameBlock futuro.

Como en general la predeclaración no se usa mucho y las clases se suelen definir dentro de un paquete o de la StdLib sólo hay que tener cuidado de no usar nombres usados en la StdLib, si es que hay alguno predeclarado, que no lo tengo claro.

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

Cc: Pedro Gea added
Note: See TracTickets for help on using tickets.