mirror of
https://github.com/Open-Argon/argon-v3.git
synced 2025-12-06 08:56:07 +00:00
add create functions
This commit is contained in:
@@ -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{}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user