//For each item, Value acts as the identity unless the item is a quote. //If it is a quote attempt to invoke and return result if there were no errors //If invocation fails for any reason Value returns the quote as a literal. func Value(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { gelo.ArgumentError(vm, "value", "items+", "") } return args.MapOrApply(func(w gelo.Word) gelo.Word { return vm.API.TailInvokeWordOrReturn(w) }) }
func Copy(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { gelo.ArgumentError(vm, "copy", "values+", "") } return args.MapOrApply(func(w gelo.Word) gelo.Word { return w.Copy() }) }
func Type_of(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { gelo.ArgumentError(vm, "type-of", "value+", "") } return args.MapOrApply(func(w gelo.Word) gelo.Word { return w.Type() }) }
func NaNp(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { return gelo.False } return args.MapOrApply(func(w gelo.Word) gelo.Word { return gelo.ToBool(math.IsNaN(vm.API.NumberOrElse(w).Real())) }) }
func Negativep(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { return gelo.False } return args.MapOrApply(func(w gelo.Word) gelo.Word { return gelo.ToBool(vm.API.NumberOrElse(w).Real() < 0) }) }
// Unlike And and Or, Not only works on bools func Not(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { return gelo.False } return args.MapOrApply(func(w gelo.Word) gelo.Word { return gelo.ToBool(!vm.API.BoolOrElse(w).True()) }) }
func Invokablep(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { return gelo.False } return args.MapOrApply(func(w gelo.Word) gelo.Word { _, ok := vm.API.IsInvokable(w) return gelo.ToBool(ok) }) }
func Setp(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { gelo.ArgumentError(vm, "set?", "name+", args) } return args.MapOrApply(func(w gelo.Word) gelo.Word { _, ok := vm.Ns.Lookup(w) return gelo.ToBool(ok) }) }
func Abs(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { return gelo.NewNumber(0) } return args.MapOrApply(func(w gelo.Word) gelo.Word { n := vm.API.NumberOrElse(w).Real() return gelo.NewNumber(math.Abs(n)) }) }
func Integerp(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { return gelo.False } return args.MapOrApply(func(w gelo.Word) gelo.Word { n := vm.API.NumberOrElse(w) _, ok := n.Int() return gelo.ToBool(ok) }) }
func InvokableOrId(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { return gelo.Null } return args.MapOrApply(func(w gelo.Word) gelo.Word { i, ok := vm.API.IsInvokable(w) if !ok { return w } return i }) }
func Unsetx(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { gelo.ArgumentError(vm, "unset!", "name+", args) } return args.MapOrApply(func(w gelo.Word) gelo.Word { val, ok := vm.Ns.Del(w) if !ok { gelo.VariableUndefined(vm, w) } return val }) }
func NumberCon(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { return gelo.NewNumber(0) } return args.MapOrApply(func(w gelo.Word) gelo.Word { if n, ok := w.(*gelo.Number); ok { return n } if n, ok := gelo.NewNumberFromBytes(w.Ser().Bytes()); ok { return n } return gelo.False }) }
func Sgn(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { gelo.ArgumentError(vm, "sgn", "number+", "") } return args.MapOrApply(func(w gelo.Word) gelo.Word { n := vm.API.NumberOrElse(w).Real() switch { case n < 0: n = -1 case n > 0: n = 1 case n == 0: n = 0 } return gelo.NewNumber(n) }) }
func MakeInvokable(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac == 0 { return gelo.Noop } return args.MapOrApply(func(w gelo.Word) gelo.Word { i, ok := vm.API.IsInvokable(w) if !ok { return gelo.Alien( func(vm *gelo.VM, args *gelo.List, ac uint) gelo.Word { if ac != 0 { gelo.ArgumentError(vm, w.Ser(), "", args) } return w }) } return i }) }