Pointer semantics simulation in Wolfram Language.
Ref[lvalue]refers tolvalue.Deref[ref]dereference.RefQ[expr]check ifexpris a reference.MakeRef[value]create a reference with thevalue.ExpandDerefAsLValue[expr]expands dereference in theexpras 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*)