Skip to content

miRoox/LValueRef

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LValueRef`

GitHub Actions Status

Pointer semantics simulation in Wolfram Language.

  • Ref[lvalue] refers to lvalue.
  • Deref[ref] dereference.
  • RefQ[expr] check if expr is a reference.
  • MakeRef[value] create a reference with the value.
  • ExpandDerefAsLValue[expr] expands dereference in the expr as lvalue.

Usage

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*)

Possible alternatives

For simple cases:

a=1;
ra:=Unevaluated@@Hold[a]
f[r_]:=r=2
f[ra];
a
(*Out[*]= 2*)