Dear Steve,


thanks for you answer!

>Apologies for the slow response.
no problem!


>I think you have confused 'MakeImmutable' with 'MakeReadOnlyGlobal'.

Oh, that was the case... thanks for clarifying!


> there is no way to "lock" an operation, [..] it would also cause problems

Let for now assume that it is not necessary to lock operations. Then in my opinion a user should get at least a warning that locking is not possible when trying it. By the way, It shouldn't be possible to lock existing read-only operations, so it is not obvious to me that locking an operation would cause problems a priori. It also seems that other functionality in GAP has similar behaviour which is unusual from my point of view: actions fail without a warning, e.g. calling an attribute setter twice with different values (the second call has no effect)


I asked for local constants, because a language should support the user to write correct code (and at the same time not to sacrifice performance too much). Since this would result in a performance penalty, it's probably ok to go without read-only locals, but code reviewing and testing is even more important then.



Best,


Jakob






Am 08.03.2012 19:18, schrieb Stephen Linton:
Dear Jakob, Dear GAP Forum,

Apologies for the slow response.
I think you have confused MakeImmutable with MakeReadOnlyGlobal.

MakeImmutable is used to make an OBJECT (and its subobjects) immutable, so that 
one can be sure that its mathematical value will not change.

A simple example is:

gap>  l := [1,2,3];;
gap>  MakeImmutable(l);
[ 1, 2, 3 ]
gap>  l[2] := 4;
Error, Lists Assignment:<list>  must be a mutable list
not in any function at line 3 of *stdin*
you can 'return;' and ignore the assignment
brk>
gap>  l := "foo";
"foo"

In this example the list created on the first line is later made immutable, but 
the variable l remains writable.
Functions, operations, properties, etc. are all immutable already, so 
MakeImmutable does nothing to them.

MakeReadOnlyGlobal makes a global VARIABLE read-only.

gap>  x := 3;
3
gap>  MakeReadOnlyGlobal("x");
gap>  x := 2;
Error, Variable: 'x' is read only
not in any function at line 6 of *stdin*
you can 'return;' after making it writable
brk>

This has no effect on the object referred to by the variable, as seen in:

gap>  y := rec(a := 1);
rec( a := 1 )
gap>  MakeReadOnlyGlobal("y");
gap>  y.a := 2;
gap>  y;
rec( a := 2 )


While I am not sure exactly what the reasoning behind your example is, there is no way to 
"lock" an operation so that further methods for it cannot be installed.
I can see no need for such a feature, and lots of ways in which it would cause 
problems, such as interference between packages.

Finally, you ask about local constants. There is no way in GAP to make local 
variable read-only, but since its scope is limited to a single function, it is 
usually pretty easy to avoid simply avoid assigning to it. Adding such a 
feature would either greatly complicate the parser, or slow down local variable 
access at run-time, and neither of these seems desirable.


        Steve Linton

On 2 Mar 2012, at 17:43, kroeker wrote:

Dear GAP-Forum,


I am a little bit confused about protecting variables.
Is it possible in all cases, and if not, will this be possible in future
versions of GAP?

For example, I failed to protect a 'Property':


######################################
exampleRec := rec();
exampleRec.IsShape := NewProperty("IsShape",IsObject);
InstallMethod(exampleRec.IsShape , "" ,[IsObject],
function(obj)
    return false;
end
);

exampleRec.IsShape := MakeImmutable(exampleRec.IsShape);
exampleRec := MakeImmutable(exampleRec);

IsMutable(exampleRec);
IsMutable(exampleRec.IsShape);

InstallMethod(exampleRec.IsShape , "" ,[IsObject],
function(obj)
    return true;
end
);
# I would expect an error , but there is none!

exampleRec.IsShape(4);
######################################


My second question is, how to define  local constants?
For example, I would like to protect  'constantInt':

######################################
    local constantInt;
    constantInt := 5;
    # how to protect  constantInt?
######################################


Thanks,


Jakob

_______________________________________________
Forum mailing list
Forum@mail.gap-system.org
http://mail.gap-system.org/mailman/listinfo/forum

_______________________________________________
Support mailing list
supp...@gap-system.org
http://mail.gap-system.org/mailman/listinfo/support


_______________________________________________
Forum mailing list
Forum@mail.gap-system.org
http://mail.gap-system.org/mailman/listinfo/forum

Reply via email to