add create functions

This commit is contained in:
2023-02-27 00:07:13 +00:00
parent f0620354c0
commit 1b3a4c44d9
23 changed files with 580 additions and 125 deletions

View File

@@ -2,7 +2,7 @@ package main
import (
"fmt"
"time"
"math/big"
)
type builtinFunc struct {
@@ -25,9 +25,17 @@ func ArgonAdd(args ...any) (any, ArErr) {
}, args), ArErr{}
}
func ArgonDiv(args ...any) (any, ArErr) {
return reduce(func(x any, y any) any {
return newNumber().Quo(y.(number), x.(number))
}, args), ArErr{}
if len(args) == 0 {
return nil, ArErr{TYPE: "Division Error", message: "Cannot divide nothing", EXISTS: true}
}
output := args[0].(number)
for i := 1; i < len(args); i++ {
if args[i].(number).Cmp(newNumber()) == 0 {
return nil, ArErr{TYPE: "Division Error", message: "Cannot divide by zero", EXISTS: true}
}
output = newNumber().Quo(output, args[i].(number))
}
return output, ArErr{}
}
func ArgonMult(args ...any) (any, ArErr) {
@@ -36,14 +44,61 @@ func ArgonMult(args ...any) (any, ArErr) {
}, args), ArErr{}
}
func ArgonSleep(args ...any) (any, ArErr) {
func ArgonInput(args ...any) (any, ArErr) {
// allow a message to be passed in as an argument
if len(args) > 0 {
float, _ := args[0].(number).Float64()
time.Sleep(time.Duration(float*1000000000) * time.Nanosecond)
fmt.Print(anyToArgon(args[0], false))
}
return nil, ArErr{}
var input string
fmt.Scanln(&input)
return input, ArErr{}
}
func ArgonTimestamp(args ...any) (any, ArErr) {
return newNumber().Quo(newNumber().SetInt64(time.Now().UnixNano()), newNumber().SetInt64(1000000000)), ArErr{}
func ArgonNumber(args ...any) (any, ArErr) {
if len(args) == 0 {
return newNumber(), ArErr{}
}
switch x := args[0].(type) {
case string:
if !numberCompile.MatchString(x) {
return nil, ArErr{TYPE: "Number Error", message: "Cannot convert type '" + typeof(x) + "' to a number", EXISTS: true}
}
N, _ := newNumber().SetString(x)
return N, ArErr{}
case number:
return x, ArErr{}
case bool:
if x {
return newNumber().SetInt64(1), ArErr{}
}
return newNumber().SetInt64(0), ArErr{}
case nil:
return newNumber(), ArErr{}
}
return nil, ArErr{TYPE: "Number Error", message: "Cannot convert " + typeof(args[0]) + " to a number", EXISTS: true}
}
func ArgonSqrt(a ...any) (any, ArErr) {
if len(a) == 0 {
return nil, ArErr{TYPE: "sqrt", message: "sqrt takes 1 argument",
EXISTS: true}
}
r := a[0].(number)
if r.Sign() < 0 {
return nil, ArErr{TYPE: "sqrt", message: "sqrt takes a positive number",
EXISTS: true}
}
var x big.Float
x.SetPrec(30) // I didn't figure out the 'Prec' part correctly, read the docs more carefully than I did and experiement
x.SetRat(r)
var s big.Float
s.SetPrec(15)
s.Sqrt(&x)
r, _ = s.Rat(nil)
return r, ArErr{}
}