|
@@ -460,6 +460,51 @@ func comma(vm * VM, val ...Value) []Value {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+func of(vm * VM, val ... Value) []Value {
|
|
|
|
+ var object Value
|
|
|
|
+ var name string
|
|
|
|
+ _, err := ParseArgs(val, &object, &name)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return Fail(err)
|
|
|
|
+ }
|
|
|
|
+ target, ok := object.(Object)
|
|
|
|
+ if !ok {
|
|
|
|
+ return Fail(vm.Errorf("Target cannot be invoked: %s %v", name, object))
|
|
|
|
+ }
|
|
|
|
+ return Ok(target.Get(name))
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+func _make(vm * VM, val ... Value) []Value {
|
|
|
|
+ var object Value
|
|
|
|
+ var name string
|
|
|
|
+ rest, err := ParseArgs(val, &object, &name)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return Fail(err)
|
|
|
|
+ }
|
|
|
|
+ target, ok := object.(Object)
|
|
|
|
+ if !ok {
|
|
|
|
+ return Fail(vm.Errorf("Target cannot be invoked: %s %v", name, object))
|
|
|
|
+ }
|
|
|
|
+ return Ok(target.Set(name, rest[0]))
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+func call(vm * VM, val ... Value) []Value {
|
|
|
|
+ var object Value
|
|
|
|
+ var name string
|
|
|
|
+ rest, err := ParseArgs(val, &object, &name)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return Fail(err)
|
|
|
|
+ }
|
|
|
|
+ target, ok := object.(Object)
|
|
|
|
+ if !ok {
|
|
|
|
+ return Fail(vm.Errorf("Target cannot be invoked: %s %v", name, object))
|
|
|
|
+ }
|
|
|
|
+ return target.Invoke(name, rest...)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
|
|
func (vm *VM) RegisterBuiltinTypes() {
|
|
func (vm *VM) RegisterBuiltinTypes() {
|
|
vm.RegisterTop("Int", IntType)
|
|
vm.RegisterTop("Int", IntType)
|
|
@@ -539,6 +584,10 @@ func (vm *VM) RegisterBuiltins() {
|
|
Over("subf", 0, FloatType, IntType),
|
|
Over("subf", 0, FloatType, IntType),
|
|
Over("subf", 0, IntType, FloatType))
|
|
Over("subf", 0, IntType, FloatType))
|
|
|
|
|
|
|
|
+ vm.RegisterBuiltinWithHelp("of", of, "Gets a field in an Object value").Takes(AnyType, StringType).Returns(AnyType)
|
|
|
|
+ vm.RegisterBuiltinWithHelp("make", _make, "Sets a field in an Object value").Takes(AnyType, StringType, AnyType).Returns(AnyType)
|
|
|
|
+ vm.RegisterBuiltinWithHelp("call", call, "Calls a method of an Object value").Takes(AnyType, StringType, AnyType).Returns(AnyType)
|
|
|
|
+
|
|
vm.Alias("*", "mul")
|
|
vm.Alias("*", "mul")
|
|
vm.Alias("+", "add")
|
|
vm.Alias("+", "add")
|
|
vm.Alias("/", "div")
|
|
vm.Alias("/", "div")
|