abs and modify operations so they are opp

This commit is contained in:
2023-03-26 21:42:44 +01:00
parent c6c608ad91
commit 364afa630d
11 changed files with 656 additions and 185 deletions

77
src/abs.go Normal file
View File

@@ -0,0 +1,77 @@
package main
import (
"fmt"
"strings"
)
var AbsCompiled = makeRegex(`( *)\|(.|\n)+\|( *)`)
type ABS struct {
body any
code string
line int
path string
}
func isAbs(code UNPARSEcode) bool {
return AbsCompiled.MatchString(code.code)
}
func parseAbs(code UNPARSEcode, index int, codelines []UNPARSEcode) (any, bool, ArErr, int) {
trimmed := strings.TrimSpace(code.code)
trimmed = trimmed[1 : len(trimmed)-1]
val, worked, err, i := translateVal(UNPARSEcode{
trimmed,
code.realcode,
code.line,
code.path,
}, index, codelines, 0)
if !worked {
return nil, false, err, 0
}
return ABS{
val,
code.realcode,
code.line,
code.path,
}, true, ArErr{}, i
}
func runAbs(x ABS, stack stack, stacklevel int) (any, ArErr) {
resp, err := runVal(x.body, stack, stacklevel+1)
if err.EXISTS {
return nil, err
}
if typeof(resp) != "number" {
return nil, ArErr{TYPE: "Runtime Error",
message: fmt.Sprintf("abs expected number, got %s", typeof(resp)),
EXISTS: true,
}
}
return abs(resp.(number)), ArErr{}
}
func abs(x number) number {
if x.Sign() < 0 {
return x.Neg(x)
}
return x
}
var ArAbs = builtinFunc{"abs", func(args ...any) (any, ArErr) {
if len(args) != 1 {
return nil, ArErr{TYPE: "Runtime Error",
message: fmt.Sprintf("abs expected 1 argument, got %d", len(args)),
EXISTS: true,
}
}
if typeof(args[0]) != "number" {
return nil, ArErr{TYPE: "Runtime Error",
message: fmt.Sprintf("abs expected number, got %s", typeof(args[0])),
EXISTS: true,
}
}
return abs(args[0].(number)), ArErr{}
}}