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