﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	severity	resolution	keywords	cc
1428	Uso de PutName en ciclos	Pedro Gea	Víctor de Buen Remiro	"El método más común cuando se quiere poner un nombre a la salida de una función es usar {{{PutName}}}. Sin embargo, este método no funciona como se espera en algunas circunstancias, provocando el uso mecanismos alternativos que crean copias.

El crear copias de determinados objetos reduce la eficiencia de los métodos (véase #1426) por lo que parece conveniente buscar algún método para esquivarlo.

Consideremos por ejemplo la función:
{{{
Matrix Fun(Matrix m) {
  Real i = MatDat(m,1,1);
  If(i > 5, PutName(""V.""<<i, m), {
    Matrix m2 = m * 2;
    PutName(""V.""<<i, m2)
  })
};
}}}
que duplica una matriz (en determinados casos) y cambia su nombre.

Esta función no actúa como se espera, y no cambia el nombre de aquellos objetos que devuelve tal y como recibe. Por ejemplo:
{{{
Set matrices = For(1, 10, Matrix (Real i) {
  Eval(""Matrix ""<<Char(64+i)<<"" = Row(i)"")
});
Set EvalSet(matrices, Fun);
}}}

¿Es esto un error en el funcionamiento de {{{PutName}}}? ¿hay alguna alternativa, dejando de un lado la conveniencia o no de hacerlo así?

Otras variantes que sí funcionan (pero que hacen una copia) y que se están usando en lugar de {{{PutName}}} son:
{{{
Anything PutName2(Text name, Anything a) {
  Anything a_ = a;
  PutName(name, a_)
};

Anything PutName3(Text name, Anything a) {
  Eval(""Anything ""<<name<<"" = a"")
};
}}}

"	doubt	closed	highest	Mantainance	Kernel		critical	fixed		
