По сути, я ищу что-то более или менее эквивалентное следующему коду C:
int theGlobalCount = 0;
int
theGlobalCount_get() { return theGlobalCount; }
void
theGlobalCount_set(int n) { theGlobalCount = n; return; }
По сути, я ищу что-то более или менее эквивалентное следующему коду 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). Вот работающий пример, который использует эту функцию: