|
@@ -99,11 +99,8 @@ func sumf(vm *VM, args ...Value) []Value {
|
|
|
|
|
|
func addi(vm *VM, args ...Value) []Value {
|
|
func addi(vm *VM, args ...Value) []Value {
|
|
var v1, v2 int
|
|
var v1, v2 int
|
|
- _, err := ParseArgs(args, &v1, &v2)
|
|
|
|
- if err != nil {
|
|
|
|
- return Fail(err)
|
|
|
|
- }
|
|
|
|
- return IntOk(v1 + v2)
|
|
|
|
|
|
+ ParseArgs(args, &v1, &v2)
|
|
|
|
+ return IntOk(v1 + v2)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -302,6 +299,9 @@ func fetchl(vm *VM, args ...Value) []Value {
|
|
if err != nil {
|
|
if err != nil {
|
|
return Fail(err)
|
|
return Fail(err)
|
|
}
|
|
}
|
|
|
|
+ if (index < 0) || (index >= len(list.List)) {
|
|
|
|
+ return Fail(fmt.Errorf("index out of range: %d<->%d", index, len(list.List)))
|
|
|
|
+ }
|
|
return Ok(list.List[index])
|
|
return Ok(list.List[index])
|
|
}
|
|
}
|
|
|
|
|
|
@@ -312,9 +312,12 @@ func storel(vm *VM, args ...Value) []Value {
|
|
if err != nil {
|
|
if err != nil {
|
|
return Fail(err)
|
|
return Fail(err)
|
|
}
|
|
}
|
|
- if len (rest) < 1 {
|
|
|
|
|
|
+ if len(rest) < 1 {
|
|
return Fail(fmt.Errorf("fetch: need 3 arguments"))
|
|
return Fail(fmt.Errorf("fetch: need 3 arguments"))
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+ if (index < 0) || (index >= len(list.List)) {
|
|
|
|
+ return Fail(fmt.Errorf("index out of range: %d<->%d", index, len(list.List)))
|
|
|
|
+ }
|
|
list.List[index] = rest[0]
|
|
list.List[index] = rest[0]
|
|
return Ok(list.List[index])
|
|
return Ok(list.List[index])
|
|
}
|
|
}
|
|
@@ -421,23 +424,6 @@ func (door * Door) Position() *Position {
|
|
return &Position{"builtin.go", 427, 8}
|
|
return &Position{"builtin.go", 427, 8}
|
|
}
|
|
}
|
|
|
|
|
|
-type CallableValue interface {
|
|
|
|
- Callable
|
|
|
|
- Value
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-func Redispatch(from CallableValue, vm *VM, args...Value) []Value {
|
|
|
|
- if len(args) < 1 {
|
|
|
|
- return EmptyValueArray()
|
|
|
|
- }
|
|
|
|
- var word WordValue
|
|
|
|
- _, err := ParseOptArgs(args, 1, &word)
|
|
|
|
- if err != nil {
|
|
|
|
- return Fail(err)
|
|
|
|
- }
|
|
|
|
- args[0] = from
|
|
|
|
- return vm.CallNamed(string(word), args...)
|
|
|
|
-}
|
|
|
|
|
|
|
|
func (door * Door) Call(vm *VM, args...Value) []Value {
|
|
func (door * Door) Call(vm *VM, args...Value) []Value {
|
|
return Redispatch(door, vm, args...)
|
|
return Redispatch(door, vm, args...)
|
|
@@ -512,15 +498,15 @@ func (vm *VM) RegisterBuiltins() {
|
|
vm.RegisterBuiltin("cover", cover)
|
|
vm.RegisterBuiltin("cover", cover)
|
|
vm.RegisterBuiltin("fetchl", fetchl)
|
|
vm.RegisterBuiltin("fetchl", fetchl)
|
|
vm.RegisterBuiltin("fetchm", fetchm)
|
|
vm.RegisterBuiltin("fetchm", fetchm)
|
|
- vm.RegisterBuiltin("sumi", sumi)
|
|
|
|
- vm.RegisterBuiltin("sumf", sumf)
|
|
|
|
- vm.RegisterBuiltin("subi", subi)
|
|
|
|
- vm.RegisterBuiltin("subf", subf)
|
|
|
|
- vm.RegisterBuiltin("divi", divi)
|
|
|
|
- vm.RegisterBuiltin("divf", divf)
|
|
|
|
|
|
+ vm.RegisterBuiltin("sumi", sumi).Takes(IntType, IntType).Returns(IntType)
|
|
|
|
+ vm.RegisterBuiltin("sumf", sumf).Takes(FloatType, FloatType).Returns(FloatType)
|
|
|
|
+ vm.RegisterBuiltin("subi", subi).Takes(IntType, IntType).Returns(IntType)
|
|
|
|
+ vm.RegisterBuiltin("subf", subf).Takes(FloatType, FloatType).Returns(FloatType)
|
|
|
|
+ vm.RegisterBuiltin("divi", divi).Takes(IntType, IntType).Returns(IntType)
|
|
|
|
+ vm.RegisterBuiltin("divf", divf).Takes(FloatType, FloatType).Returns(FloatType)
|
|
vm.RegisterBuiltin("map", newmap)
|
|
vm.RegisterBuiltin("map", newmap)
|
|
- vm.RegisterBuiltin("muli", muli)
|
|
|
|
- vm.RegisterBuiltin("mulf", mulf)
|
|
|
|
|
|
+ vm.RegisterBuiltin("muli", muli).Takes(IntType, IntType).Returns(IntType)
|
|
|
|
+ vm.RegisterBuiltin("mulf", mulf).Takes(FloatType, FloatType).Returns(FloatType)
|
|
vm.RegisterBuiltinWithHelp("orb", orb, `[Bool Bool] -> Bool: returns true if on of it's arguments is true`)
|
|
vm.RegisterBuiltinWithHelp("orb", orb, `[Bool Bool] -> Bool: returns true if on of it's arguments is true`)
|
|
// vm.RegisterCover("add")
|
|
// vm.RegisterCover("add")
|
|
vm.RegisterBuiltin("p", p)
|
|
vm.RegisterBuiltin("p", p)
|