可变记录字段和{x with ...}

时间:2012-11-07 23:42:25

标签: ocaml record semantics mutable

我一直在阅读ocaml文档,但我不能解释{ x with ... }如何围绕可变字段工作。 closest I've found

  

6.7表达式

expr := ...
    ∣ { expr with  field =  expr  { ; field =  expr }  [;] }
     

...

     

记录

     

表达式{ expr with field1 = expr1 ; … ; fieldn = exprn }构建一条新记录,fields field1 … fieldn等于expr1 … exprn,所有其他字段的值与记录expr中的值相同。换句话说,它会返回记录expr浅层副本,但field1 … fieldn字段除外,这些字段已初始化为expr1 … exprn

“浅拷贝”措辞可以解释为未提及的mutable字段共享存储空间或可以引用嵌套记录。当我测试时(使用“The OCaml toplevel,版本4.00.1”)因此

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
;;

我得到的结果表明b.x没有别名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}

这让我很开心,但我想确保

{ e with fi=x }

之类的有效语法糖
(let tmp=e in { f0=tmp.f0; … fi-1=tmp.fi-1; fi=x; fi+1=tmp.fi+1; …; fn=tmp.fn })

并且mutable字段不能由ref支持,实现可以重用,而不是分配新的可变存储。

1 个答案:

答案 0 :(得分:3)

我见过的所有地方,“浅拷贝”意味着,简单地将所有组件转移,就像通过赋值一样,即使在所有字段总是可变的语言中,如Java。所以在这种情况下(let tmp=e in { f0=tmp.f0; … fi-1=tmp.fi-1; fi=x; fi+1=tmp.fi+1; …; fn=tmp.fn })正是它的意思。