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

#1175 closed defect (fixed)

Accessing member information

Reported by: Pedro Gea Owned by: Víctor de Buen Remiro
Priority: high Milestone: Mantainance
Component: Kernel Version: head
Severity: normal Keywords:
Cc:

Description

Sería muy interesante disponer de un método para obtener el conjunto de nombres de los atributos de un nameblock y no tener que recurrir al artificio:

Set EvalSet(NameBlockToSet(nameblock), Name);

Quizá podría ofrecerse el listado de miembros con alguna estructura informativa de modo que pudiera luego filtrarse si es atributo o método es público oprivado, heredado o propio, etc.
Pudiendo hacerse fácilmente cosas como:

Set selection = Select(Members(nameblock), Real (Set member) {
  member->Grammar=="Real" & member->Access=="Public"
});
Set EvalSet(selection, Text (Set member) { member->Name });

Change History (4)

comment:1 Changed 14 years ago by Pedro Gea

Probablemente sería adecuado disponer de un método de este tipo también con las clases, para acceder al menos a sus miembros (los miembros declarados como Static).

En este caso el método debería recibir el nombre de la clase. Algo como:

Set ClassMembers("@NombreDeLaClase");

Yo diferenciaría este método "ClassMembers" que devuelve qué llamadas del tipo @NombreDeLaClase::Miembro están disponibles, de otro método: "InstanceMembers" que devolvería algo similar a lo que hace "Members" sobre un nameblock o instancia,
devolviendo los miembros que tendrían sus instancias (incluidos los heredados).

Set InstanceMembers("@NombreDeLaClase");
// == Members(instanceOfNombreDeLaClase)

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

(In [3457]) Refs #1175

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

Resolution: fixed
Status: newclosed

Ya están creadas las nuevas funciones

Acceso a miembros de objetos

Set Members(NameBlock nameBlock)

Devuelve un conjunto con un registro de información acerca de cada uno de los miembros de un NameBlock mediante la estructura

  @NameBlockMemberInfo {
    Text Type,
    Text Name,
    Text Access,
    Text DefinedAtClass,
    Text Description
}

Ejemplos

//Si no es instancia DefinedAtClass siempre será la cadena vacía
Set Members(StdLib);

Class @A 
{
  Real x;
  Real _f=1;
  Real _.g=2;
  Real fun(Real y) { (x*y)^_f-g_.g }
};

//Si es una instancia DefinedAtClass siempre nunca la cadena vacía
@A a = [[
  Real x = 2
]];
Set Members(a);

//Si es una instancia ampliada DefinedAtClass puede ser vacía o no
@A b = [[
  Real x = 2;
  Real z = 765
]];
Set Members(b);

Acceso a miembros de clases

Set ClassMembers(Text className [, Real static=?] )

Devuelve un conjunto con un registro de información acerca de cada uno de los miembros de una clase. Si static==0 sólo se devolverán los registros acerca de elementos no estáticos. Si static==1 sólo se devolverán los registros acerca de elementos estáticos. En otro caso se devolverán todos los registros. La información se devuelve usando la estructura:

  @ClassMemberInfo { 
    Real Static,
    Real Method,
    Text Declaration,
    Text Name,
    Text Access,
    Text DefinedAtClass,
    Text Description }

Ejemplos:

Set all = ClassMembers("@MultiTryMetropolis_ARIMA");
Set just_static = ClassMembers("@MultiTryMetropolis_ARIMA",1);
Set non_static = ClassMembers("@MultiTryMetropolis_ARIMA",0);

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

(In [3461]) Refs #1175
Just comments

Note: See TracTickets for help on using tickets.