Pointer semantics simulation in Wolfram Language.
Ref[lvalue]
refers tolvalue
.Deref[ref]
dereference.RefQ[expr]
check ifexpr
is a reference.MakeRef[value]
create a reference with thevalue
.ExpandDerefAsLValue[expr]
expands dereference in theexpr
as lvalue.
Load Package:
Needs["LValueRef`"]
Dereference:
a=1;
b=Ref[a];
Deref@b
(*Out[*]= 1*)
L-value:
a=1;
b=Ref[a];
Deref@b=2;
a
(*Out[*]= 2*)
Or more complicated:
a={1,2,3};
b=Ref[a];
(Deref@b)[[2]]=4;
a
(*Out[*]= {1,4,3}*)
Not only symbols can be referenced:
a={1,2,3};
b=Ref[a[[2]]];
Deref@b=4;
a
(*Out[*]= {1,4,3}*)
Multiple references:
a=1;
b=Ref[a];
c=Ref[b];
Deref@Deref@c=2;
a
(*Out[*]= 2*)
Implicit reference
(MakeRef
is similar to new
in Java):
a = MakeRef[1];
Deref[a]
(*Out[*]= 1*)
Deref[a] = 2;
Deref[a]
(*Out[*]= 2*)
For simple cases:
a=1;
ra:=Unevaluated@@Hold[a]
f[r_]:=r=2
f[ra];
a
(*Out[*]= 2*)