Как создать глобальную переменную в ATS?

По сути, я ищу что-то более или менее эквивалентное следующему коду C:

int theGlobalCount = 0;

int
theGlobalCount_get() { return theGlobalCount; }

void
theGlobalCount_set(int n) { theGlobalCount = n; return; }

ats
person Community    schedule 29.10.2016    source источник


Ответы (2)


Вы можете использовать хитрый трюк: объявить изменяемую глобальную переменную и сделать так, чтобы 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

person Artyom Shalkhakov    schedule 29.10.2016

Вы также можете использовать функцию extvar для обновления внешней глобальной переменной (объявленной на целевом языке). Это очень полезно, если вы компилируете ATS на языке, который не поддерживает явные указатели (например, JavaScript). Вот работающий пример, который использует эту функцию:

http://www.ats-lang.org/SERVER/MYCODE/Patsoptaas_serve.php?mycode_url=http://pastebin.com/raw/MsXhVE0A

person Hongwei Xi    schedule 08.11.2016