Например, как я могу писать код в АТС, которая пересекает заданную строку, как это делается с помощью следующего кода C:Как построить цикл в ATS над данной строкой?
while ((c = *str++) != 0) do_something(c);
Например, как я могу писать код в АТС, которая пересекает заданную строку, как это делается с помощью следующего кода C:Как построить цикл в ATS над данной строкой?
while ((c = *str++) != 0) do_something(c);
Ну, всегда есть комбинатор решение на основе:
(str).foreach()(lam(c) => do_something(c))
следующее решение использует UnSafe но это должно быть очень легко получить доступ:
staload
UNSAFE =
"prelude/SATS/unsafe.sats"
fun
loop(p0: ptr): void = let
val c = $UNSAFE.ptr_get<char>p0)
in
if isneqz(c) then (do_something(c); loop(ptr_succ<char>(p0)) else()
end
val() = loop(string2ptr(str))
следующее решение легко, доступно и не требует любые небезопасные функции (но он использует одну расширенную функцию: индексный тип строки).
fun
loop {n:int}(p0: string(n)): void =
if string_isnot_empty (p0) then let
val c = (g0ofg1)(string_head(p0))
val p0 = string_tail(p0)
in
do_something(c); loop(p0)
end
Полный код: https://glot.io/snippets/ejpwxk2xzx
Обратите внимание, что 'isneqz' перегружен' string_isnot_empty'. –