Up |
Set the value of an element of a tuple from its position.
If the position is out of range, the function will return nil.
This function should be reserved to the advanced developers only, a bad use can do something unwanted. A good use should be safe.
Usually, two cases can occur :
You can set with any type, even if it is different than the old type. Depending on what you wish to do, this may don't be a problem. But remember you that for all futures treatments the type has changed. This may be harmless ... or not.
Look this code, it works fine :
typeof TUPLE = [I I I];;
fun displayTuple (a, n)=
if n < 0 then
0
else
(
_fooId tupleGet a n nil;
displayTuple a n-1
);;
fun main ()=
_showconsole;
set TUPLE = [1 5 4];
_fooS "TUPLE";
_fooId tupleGet TUPLE 1 nil;
displayTuple TUPLE (tupleSize TUPLE)-1;
tupleSet TUPLE 1 "string";
_fooS tupleGet TUPLE 1 nil;
displayTuple TUPLE (tupleSize TUPLE)-1;
0;;
The type displayTuple is fun [u0 I] I
and _fooId
accepts all types. However, in some complex process, a modified type can be dangerous.
Finally, even if the type of TUPLE is [I I I]
, Scol " accepts " this
change to [I S I]
during the execution (because
the prototype of the tuple in tupleGet is u0
during the
compilation and Scol ignores types to the execution).
Other example :
fun main ()=
_showconsole;
let 0 -> a in
let tupleSet a 0 "string" -> b in
(
_fooId a; // 0
_fooId b; // 0
_fooS tupleGet b 0 nil; // string
);
tupleSet returns an integer because 'a' is an integer (even if it is not a tuple !
tupleSet returns the same type),
therefore b is an integer :
tupleGet b 0 nil
returns the first and unique element of b, a string.
It is correct with _fooS.
Now, a "little" change :
fun main ()=
_showconsole;
let 0 -> a in
let tupleSet a 0 "string" -> b in
(
_fooId a;
_fooS b; // change _fooId by _fooS
_fooS tupleGet b 0 nil;
);
Here, this code crashes :
>>> ERROR - Type mismatch (detail):
Found: [I S S]
Expected: [I I u0]
<<<
Indeed, b (see above) is considered by Scol like an integer, not like a string.
Developers to be careful what they do !
If you change the old value by a new value of the same type, you should have no problem.
fun [u0 I u1] u0
Return : u0 the same tuple or nil if error
Error :
fun setTuple (tuple, c)=
set tuple = tupleSet tuple 0 c; // set the first element to 'c'
if c < tupleGet tuple 1 nil then // set the second element if the condition is true
set tuple = tupleSet tuple 1 c + tupleGet tuple 1 nil; // old value + 'c'
else
nil;
0;;
fun initTuple (tuple, a, b)=
set tuple = [a b b];
// others things to do
0;;
The first element has always the index 0.