Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Global variables in Ocaml

I am looking for a way to define global variables in ocaml so that i can change their value inside the program. The global variable that I want to user is:

type state = {connected : bool ; currentUser : string};;
let currentstate = {connected = false ; currentUser = ""};;

How can I change the value of connected and currentUser and save the new value in the same variable currentstae for the whole program?

like image 214
Sara4391 Avatar asked Dec 10 '13 20:12

Sara4391


2 Answers

Either declare a mutable record type:

type state = 
  { mutable connected : bool; mutable currentUser : string };;

Or declare a global reference

let currentstateref = ref { connected = false; currentUser = "" };;

(then access it with !currentstateref.connected ...)

Both do different things. Mutable fields can be mutated (e.g. state.connected <- true; ... but the record containing them stays the same value). References can be updated (they "points to" some newer value).

You need to take hours to read a lot more your Ocaml book (or its reference manual). We don't have time to teach most of it to you.

A reference is really like

type 'a ref = { mutable contents: 'a };;

but with syntactic sugar (i.e. infix functions) for dereferencing (!) and updating (:=)

like image 161
Basile Starynkevitch Avatar answered Sep 30 '22 12:09

Basile Starynkevitch


type state = {connected : bool ; currentUser : string};; let currentstate = {connected = false ; currentUser = ""};;

can be translated to :

type state = {connected : bool ref ; currentUser : string ref };;
let currentstate = {connected = ref false ; currentUser = ref ""};;

to assign value :

(currentstate.connected) := true ;;
- : unit = ()

to get value :

!(currentstate.connected) ;;
- : bool = true 

you can also pattern match on its content.

read more about ref here

like image 22
cyc115 Avatar answered Sep 30 '22 11:09

cyc115