为什么是##。 js_of_ocaml 中需要运算符?

Why is the ##. operator needed in js_of_ocaml?

不确定为什么需要所有这些运算符。这是什么道理?为什么常规的 OCaml 对象语法不够用?

obj##.m
obj##.m := e
obj##m

此处的文档:http://ocsigen.org/js_of_ocaml/3.6.0/manual/ppx

OCaml 对象没有属性。如果你写 obj#m,你是在对象 obj 上调用方法 m。如果你写 obj#m := e,你再次调用对象 obj 上的方法 m 并且它 returns 类型 'e ref 的值,然后传递给运算符 (:=).

因此运算符 ##.,它只是分别调用 Js.Unsafe.getJs.Unsafe.set 的语法糖。 (同样,obj##m x yJs.Unsafe.meth_call obj "m" [|x; y|] 的语法糖。)

JSOO 不是深入修改 OCaml 编译器以实际将 Javascript 对象映射到 OCaml 对象并正确识别 getters/setters,而是依赖 OCaml 对象仅用于输入 [=30] 的薄层=] 并在执行时完全忽略它们。