add subprocess

This commit is contained in:
2023-03-21 23:03:25 +00:00
parent 54ea92886e
commit 4f3d419c28
12 changed files with 202 additions and 146 deletions

View File

@@ -165,94 +165,3 @@ func isUnhashable(val any) bool {
keytype := typeof(val)
return keytype == "array" || keytype == "map"
}
func getFromArArray(m ArObject, r ArMapGet, stack stack, stacklevel int) (any, ArErr) {
var (
start int = 0
end any = nil
step int = 1
)
{
startval, err := runVal(r.args[0], stack, stacklevel+1)
if err.EXISTS {
return ArObject{}, err
}
if startval == nil {
start = 0
} else if typeof(startval) != "number" || !startval.(number).IsInt() {
return ArObject{}, ArErr{
"TypeError",
"slice index must be an integer",
r.line,
r.path,
r.code,
true,
}
} else {
start = int(startval.(number).Num().Int64())
}
}
if len(r.args) > 1 {
endval, err := runVal(r.args[1], stack, stacklevel+1)
if err.EXISTS {
return ArObject{}, err
}
if endval == nil {
end = m.obj["length"]
} else if typeof(endval) != "number" && !endval.(number).IsInt() {
return ArObject{}, ArErr{
"TypeError",
"slice ending index must be an integer",
r.line,
r.path,
r.code,
true,
}
} else {
end = int(endval.(number).Num().Int64())
}
}
if len(r.args) > 2 {
stepval, err := runVal(r.args[2], stack, stacklevel+1)
if err.EXISTS {
return ArObject{}, err
}
if stepval == nil {
step = 1
} else if typeof(stepval) != "number" && !stepval.(number).IsInt() {
return ArObject{}, ArErr{
"TypeError",
"slice step must be an integer",
r.line,
r.path,
r.code,
true,
}
} else {
step = int(stepval.(number).Num().Int64())
}
}
if start < 0 {
start = m.obj["length"].(int) + start
}
if _, ok := end.(int); ok && end.(int) < 0 {
end = m.obj["length"].(int) + end.(int)
}
if end == nil {
return m.obj["__value__"].([]any)[start], ArErr{}
} else if step == 1 {
return ArArray([]any{m.obj["__value__"].([]any)[start:end.(int)]}), ArErr{}
} else {
output := []any{}
if step > 0 {
for i := start; i < end.(int); i += step {
output = append(output, m.obj["__value__"].([]any)[i])
}
} else {
for i := end.(int) - 1; i >= start; i += step {
output = append(output, m.obj["__value__"].([]any)[i])
}
}
return ArArray(output), ArErr{}
}
}