Hello,

I have following questions regarding lists.

1. Is it safe to pass lists as parameters to functions ?
2. Is it safe to return lists from functions ?

And also additional question.

3. Is it allowed to define sub-functions inside a function ? I have seen such 
example in lib/alglie.gi - there is subfunction in RootSystem function. But 
when I tried I see error.

Regarding first 2 questions. Since assignment
a:=b; 
for list do not create new list, I assume that list is really a pointer 
(however this is never mentioned in GAP documentation). So if I declare local 
variable in function, create list inside function and return it. Then pointer 
to a list is returned but local memory of the function can be overwritten now. 
So my list is not safe !?

Here is example
create_mat:=function (n)
  local i, m;
  m:=[];
  for i in [1..n] do
    Add(m, [i..i+n-1]);
  od;
  return m;
end;;

a:= create_mat(5);    
# what is it <a> now ? Is it matrix  (list) or just pointer to piece of memory 
which can be overwritten ?

I am asking because I am receiving strange errors when working with matrices. 
The error is saying that boolean is found where list is expected !?
For interested persons I attach my code in example.txt file.
So far everything worked OK (almost) with my matrix GAP code.

Regards,
Marek Mitros


# For matrix m returns coordinates [x,y] of all elements equal to <a> e.g. a=1.
# Assuming that in each row there is only one element equal to 1
mat_ones:=function(m,a)
  local i,j, l,x,y;
  l:=[];
  for i in [1..Length(m)] do
     if ForAny(m[i], x->x=a) then
        Add(l, [i, Position(m[i], a)]);
     fi;
  od;
  return l;

end;;

# received pair of numbers from range 1..24, returned 0..3
group24:=function(p)
  local s;
  #Print(p, " ", p[1]," ", p[2], "\n");
  s:=Set([Int(p[1]/8),Int(p[2]/8)]);
  if Length(s)=1 then
     return 0;
  else # 01, 02, 12
     return s[1]+s[2];
  fi;
end;;


# here is ..... piece of code inside another function
# mm is matrix 28*28

       ll:=mat_ones(mm,1);   # something is wrong here
       #pp:=First(ll, x->IsSubset([1..24],x));  #pair of indexes from set 
[1..24]
       pp:=ll[Position(List(ll, x->IsSubset([1..24],x)), true)];
       #Print(pp, IsList(pp),"\n");
       f[3]:=group24(pp);
       
# I see error message that pp is not list but boolean !?

_______________________________________________
Forum mailing list
[email protected]
http://mail.gap-system.org/mailman/listinfo/forum

Reply via email to