如何在 ATS 中创建全局变量?
How to create a global variable in ATS?
基本上,我正在寻找或多或少等同于以下 C 代码的东西:
int theGlobalCount = 0;
int
theGlobalCount_get() { return theGlobalCount; }
void
theGlobalCount_set(int n) { theGlobalCount = n; return; }
您可以使用一个巧妙的技巧:声明一个可变全局变量,并使 ref
(也称为可变引用)指向它(无需 GC 即可完成此工作!)。然后,实现函数以提供对可变引用的访问。
local
var theGlobalCount_var : int = 0
val theGlobalCount = ref_make_viewptr (view@ theGlobalCount_var | addr@ theGlobalCount_var)
in // in of [local]
fun
theGlobalCount_get () : int = ref_get_elt (theGlobalCount)
fun
theGlobalCount_set (n: int): void = ref_set_elt (theGlobalCount, n)
end // end of [local]
请注意 local
-in
内的声明仅对 in
-end
内的代码可见。因此,theGlobalCount_var
和 theGlobalCount
在 local
.
范围之外都不可见
完整代码:glot.io
您还可以使用 extvar
功能来更新外部全局变量(以目标语言声明)。如果您将 ATS 编译为不支持显式指针的语言(例如 JavaScript),这将非常有用。这是一个使用此功能的 运行 示例:
基本上,我正在寻找或多或少等同于以下 C 代码的东西:
int theGlobalCount = 0;
int
theGlobalCount_get() { return theGlobalCount; }
void
theGlobalCount_set(int n) { theGlobalCount = n; return; }
您可以使用一个巧妙的技巧:声明一个可变全局变量,并使 ref
(也称为可变引用)指向它(无需 GC 即可完成此工作!)。然后,实现函数以提供对可变引用的访问。
local
var theGlobalCount_var : int = 0
val theGlobalCount = ref_make_viewptr (view@ theGlobalCount_var | addr@ theGlobalCount_var)
in // in of [local]
fun
theGlobalCount_get () : int = ref_get_elt (theGlobalCount)
fun
theGlobalCount_set (n: int): void = ref_set_elt (theGlobalCount, n)
end // end of [local]
请注意 local
-in
内的声明仅对 in
-end
内的代码可见。因此,theGlobalCount_var
和 theGlobalCount
在 local
.
完整代码:glot.io
您还可以使用 extvar
功能来更新外部全局变量(以目标语言声明)。如果您将 ATS 编译为不支持显式指针的语言(例如 JavaScript),这将非常有用。这是一个使用此功能的 运行 示例: