#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
Status: | new → accepted |
---|
comment:2 Changed 14 years ago by
Ya está localizado el problema aunque la solución no es trivial. Espero poder tenerlo resuelto el lunes.
comment:4 Changed 14 years ago by
Resolution: | → fixed |
---|---|
Status: | accepted → closed |
comment:8 Changed 14 years ago by
Resolution: | fixed |
---|---|
Status: | closed → reopened |
Se ha detectado un problema en la carga de paquetes con clases relacionado con este ticket
comment:9 Changed 14 years ago by
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
comment:10 Changed 14 years ago by
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
Cc: | Pedro Gea added |
---|
Parece que está confundiéndose con la estructura @InputDef definida en C++.
Intentaré ver cómo arreglarlo.