﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	severity	resolution	keywords	cc
1184	PutName and new objects	Pedro Gea	Víctor de Buen Remiro	"La función {{{PutName}}} no puede utilizarse sobre objetos sin un nombre previo o definidos en el argumento. Por ejemplo:
{{{
#!java
Real PutName(""valor"", 2);
//ERROR: [] 2 no es un objeto valido para el tipo Real.
//Warning: [] La función PutName ha fallado en : 
//  PutName(""valor"", 2)
}}}

No sé si esta limitación tiene alguna intencionalidad o podría resolverse. 

Habitualmente para ello utilizo una función auxiliar con el siguiente código:
{{{
#!java
Anything PutName2(Text name, Anything object) {
  Anything object_ = object;
  PutName(name, object_)
};
}}}
de la que quizá podría prescindir.

También es bastante común, para asignar un nombre ver código como el siguiente:
{{{
#!java
Eval(Grammar(object)<<"" ""<<name<<"" = object"");
}}}

Aprovecho para comentar algunos otros detalles de esta función como que me confunden un poco.

Parece que la función asigna el nombre localmente pero lo comprueba globalmente.

Esto no da error cuando lo esperaría:
{{{
#!java
Real {
  Real a = 1;
  Real b = 2;
  Real PutName(""a"", b);
  Real a
};
//> 2
}}}

Sin embargo esto sí lo da y no lo esperaba:

{{{
#!java
Real a = 1;
Real {
  Real b = 2;
  Real PutName(""a"", b);
  Real a
};
//ERROR: [] No se puede hacer PutName : a existe todavía
}}}

Pero sin embargo la variable renombrada no es accesible globalmente:
{{{
#!java
Real a = 1;
Real {
  Real b = 2;
  Real PutName(""c"", b);
  Real c
};
Real c;
//ERROR: [] c no es un objeto valido para el tipo Real.
}}}
quizá porque ya no existe.

Para evitar esto suelo usar una función auxiliar 
{{{
#!java
Anything PutLocalName(Text name, Anything object) {
  Eval(Grammar(object)<<"" ""<<name<<"" = object"")
};
}}}
aunque quizá lo mejor es definir bien el comportamiento de {{{PutName}}}.

También sería necesario considerar qué nombres son aceptables, ya que ahora es admisible casi cualquier tipo de nombre, aunque vuelva al objeto inaccesible. Por ejemplo:
{{{
#!java
Real a = 1;
Real PutName(""$5./* @"", a);
}}}
Aunque solucionar esto último pueda ser delicado, porque creo que se está usando del siguiente modo:
{{{
#!java
Set conjunto = Copy(Empty);
Real a = 1;
Set Append(conjunto, [[ PutName(""$5./* @"", a) ]], True);
Real FindIndexByName(conjunto, ""$5./* @"");
//> 1
}}}"	defect	closed	high	Mantainance	Kernel	head	critical	fixed		
