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

Closed 13 years ago

Last modified 13 years ago

#1397 closed doubt (fixed)

Error en PutDescription con una función dentro de otra función

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

Description (last modified by Víctor de Buen Remiro)

Hola, al poner descripción a una función creada dentro de otra función da error. El código es:

Real FunPrueba1(Real r)
{
  Real funPrueba2(Real k)
  { 2*k };
  PutDescription("Prueba", funPrueba2);
  r/2
};
Real AA = FunPrueba1(Pi);

Y el error:

ERROR: [2] funPrueba2 no es un objeto valido para el tipo Real.

[Call stack]
  [1] Real FunPrueba1 (Real r)

Warning: [5] La función PutDescription ha fallado en : 
PutDescription("Prueba", funPrueba2)

Sin entrar a ver si tiene mucho sentido hacer eso, ¿es normal que dé error?

Un saludo.

Change History (3)

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

Description: modified (diff)
Resolution: fixed
Status: newclosed

En el ámbito global el tipo por defecto es el de la última expresión, mientras que en las funciones es el tipo de retorno de la función. Al escribir PutDescription sin especificar de qué tipo se utiliza el tipo por defecto que es Real y como no hay ningún objeto Real funPrueba2 pues te da error. No veo qué problema ves ahí. Lo que hay que hacer es poner el tipo adecuado a este caso que es el Code.

Real FunPrueba1(Real r)
{
  Real funPrueba2(Real k)
  { 2*k };
  Code PutDescription("Prueba", funPrueba2);
  r/2
};
Real AA = FunPrueba1(Pi);

comment:2 Changed 13 years ago by imendez

Gracias por la aclaración, Víctor, por eso puse el ticket como duda. No me planteaba grandes problemas, pero no sabía por qué no funcionaba.

De todas maneras, me siguen surgiendo preguntas:

  • Si PutDescription está clasificada en la gramática Anything (de hecho el código del ticket funciona si lo tipas como Anything en lugar de como Code), ¿por qué no funciona sea cual sea el tipo de objeto que espera TOL?
  • En el siguiente código, el último PutDescription también da error:
    Real FunPrueba1(Real r)
    {
      Real funPrueba2(Real k)
      { 2*k };
      
      Code PutDescription("Prueba", funPrueba2);
      r/2
    };
    Real AA = FunPrueba1(Pi);
    PutDescription("Prueba", FunPrueba1);
    

Si tipo PutDescription con Code o con Anything, no da error.
Y sin embargo este otro código, en el que no estoy tipando el PutDescription, no da error:

Real FunPrueba1(Real r)
{
  Real funPrueba2(Real k)
  { 2*k };
  
  Code PutDescription("Prueba", funPrueba2);
  r/2
};
PutDescription("Prueba", FunPrueba1);
Real AA = FunPrueba1(Pi);

Un saludo

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

Ya te he contestado a todo lo que vuelves a preguntar pero veo que no me explico muy bien.

Es que Anything no es un tipo es cualquier tipo, por eso se traga cualquier cosa, pero entonces estás renunciando al control de tipos y además le estás obligando a buscar por todos los tipos lo que cual es ineficiente.

En el segundo caso, al no especificar ningún tipo se usa el tipo por defecto, que en el ámbito global es el del último objeto creado, que ha sido una función, es decir, un objeto de tipo Code.

Note: See TracTickets for help on using tickets.