Sólo mostraré cómo encontrar esta información en GAP, una habilidad que puede ser útil en varias situaciones.
GAP tiene es una función PageSource
que puede mostrar el código fuente de una función (con comentarios, si están presentes). El argumento de PageSource
debe ser un función (no una operación - ver más adelante cómo manejar ese caso). En el caso de Elements
, eso sí que es una función:
gap> Elements;
function( coll ) ... end
para poder llamar a PageSource y ver la ubicación del código fuente y el propio código:
gap> PageSource(last);
Showing source in gap4r8p2/lib/list.gi (from line 3718)
#M Elements( <coll> )
##
## for gap3 compatibility. Because `InfoWarning' is not available
## immediately this is not in coll.gi, but in the later read list.gi
##
InstallGlobalFunction(Elements,function(coll)
Info(InfoPerformance,2,
"`Elements' is an outdated synonym for `AsSSortedList'");
Info(InfoPerformance,2,
"If sortedness is not required, `AsList' might be much faster!");
return AsSSortedList(coll);
end);
Además de otros detalles útiles, vemos que Elements
delegados a AsSSortedList
que es un atributo:
gap> AsSSortedList;
<Attribute "AsSSortedList">
El atributo es una operación, por lo que PageSource
no funcionará para él de la misma manera que en el caso anterior:
gap> PageSource(AsSSortedList);
Cannot locate source of kernel function AsSSortedList.
Esto sucede porque AsSSortedList
es en realidad un montón de métodos, y primero hay que encontrar el que se aplicará al grupo en cuestión a través de
gap> f:=ApplicableMethod(AsSSortedList,[Group( (1,2,3,4,5,6,7,8),(1,2) )]);
function( G ) ... end
Ahora se podría ver de la siguiente manera:
gap> PageSource(last);
Showing source in gap4r8p2/lib/grpperm.gi (from line 2031)
#############################################################################
##
#M AsSSortedList( <G> ) elements of perm group
##
InstallMethod( AsSSortedList,"via stabchain",true, [ IsPermGroup ], 0,
function( G )
return ElementsStabChain( StabChainMutable(G));
end );
Ambas funciones están documentadas, tipo ?ElementsStabChain
y ?StabChainMutable
en GAP para ver más detalles.
Tenga en cuenta que si el valor del atributo ya está almacenado en el objeto, ApplicableMethod
no será útil, ya que devolverá el llamado "getter del sistema" que recupera la información almacenada:
gap> G:=Group( (1,2,3,4,5,6,7,8),(1,2) );
Group([ (1,2,3,4,5,6,7,8), (1,2) ])
gap> Size(G);
40320
gap> ApplicableMethod(Size,[G]);
function( object ) ... end
gap> PageSource(last);
Cannot locate source of kernel function GetterFunc(Size).
En este caso, para encontrar el método real que se utiliza para calcular el atributo, tendría que crear el objeto desde cero:
gap> G:=Group( (1,2,3,4,5,6,7,8),(1,2) );
Group([ (1,2,3,4,5,6,7,8), (1,2) ])
gap> ApplicableMethod(Size,[G]);
function( G ) ... end
gap> PageSource(last);
Showing source in gap4r8p2/lib/grpperm.gi (from line 482)
##
InstallMethod( Size,
"for a permutation group",
true,
[ IsPermGroup ], 0,
G -> SizeStabChain( StabChainMutable( G ) ) );