Ho letto i documenti ocaml
ma non riesco a capire la parte che spiega come { x with ... }
funzioni attorno a campi mutabili. Il closest I've found dicecampi di registrazione mutabili e {x con ...}
6.7 Espressioni
expr := ... ∣ { expr with field = expr { ; field = expr } [;] }
...
Records
L'espressione
{ expr with field1 = expr1 ; … ; fieldn = exprn }
costruisce un record fresco confields field1 … fieldn
pari aexpr1 … exprn
, e tutti gli altri campi che hanno lo stesso valore come nel recordexpr
. In altri termini, restituisce una copia superficiale del recordexpr
, ad eccezione dei campifield1 … fieldn
, che vengono inizializzati suexpr1 … exprn
.
Quella "copia superficiale" verbosità potrebbe essere interpretata nel senso che i campi mutable
non menzionati condividono lo spazio di archiviazione o potrebbero fare riferimento a record annidati. Quando ho prova (usando "toplevel di OCaml, versione 4.00.1") così
type t = { mutable x : int; mutable y: int }
let a = {x=42;y=123}
let b = { a with y=124}
let _ = a.x <- 43
let _ = Printf.printf "b.x=%d\n" b.x
;;
ottengo un risultato che indica che b.x
non alias a.x
:
b.x=42
type t = { mutable x : int; mutable y : int; }
val a : t = {x = 43; y = 123}
val b : t = {x = 42; y = 124}
che mi rende molto felice, ma voglio fare in modo che
{ e with fi=x }
è lo zucchero in modo efficace sintattico per qualcosa come
0.123.516,410617 millionse che i campi non possono essere supportati da un ref
che un'implementazione potrebbe riutilizzare anziché allocare una nuova memoria mutabile.
Così si vuole solo di confermare che '{e con fi = x}' è lo zucchero in modo efficace sintattico per '(lasciare tmp = e in {F0 = tmp.f0; ... fi-1 = tmp. fi-1; fi = x; fi + 1 = tmp.fi + 1; ...; fn = tmp.fn}) '... ecc.? –
@RobertHarvey, Un puntatore ad altri documenti o una spiegazione di come leggere questi documenti sarebbe utile, ma qualsiasi cosa da qualcuno che sa cosa sia e non è un comportamento indefinito sarebbe d'aiuto. –