|
@@ -153,24 +153,24 @@ func (cv BasicCallable) Position() *Position {
|
|
type DefinedValue struct {
|
|
type DefinedValue struct {
|
|
BasicCallable
|
|
BasicCallable
|
|
Body *BlockValue
|
|
Body *BlockValue
|
|
- Parameters []*Parameter
|
|
|
|
|
|
+ Signature *Signature
|
|
}
|
|
}
|
|
|
|
|
|
-func NewDefinedValue(name string, params []*Parameter, body *BlockValue) *DefinedValue {
|
|
|
|
|
|
+func NewDefinedValue(name string, signature *Signature, body *BlockValue) *DefinedValue {
|
|
result := &DefinedValue{}
|
|
result := &DefinedValue{}
|
|
result.Name = name
|
|
result.Name = name
|
|
result.Body = body
|
|
result.Body = body
|
|
- result.Parameters = params
|
|
|
|
|
|
+ result.Signature = signature
|
|
return result
|
|
return result
|
|
}
|
|
}
|
|
|
|
|
|
func (defined *DefinedValue) Call(vm *VM, arguments ...Value) []Value {
|
|
func (defined *DefinedValue) Call(vm *VM, arguments ...Value) []Value {
|
|
- vm.Trace("Call defined value: %v %v %v", defined, defined.Parameters, arguments)
|
|
|
|
|
|
+ vm.Trace("Call defined value: %v %v %v", defined, defined.Signature, arguments)
|
|
for i , arg := range arguments {
|
|
for i , arg := range arguments {
|
|
- if i >= len(defined.Parameters) {
|
|
|
|
|
|
+ if i >= len(defined.Signature.Parameters) {
|
|
break
|
|
break
|
|
}
|
|
}
|
|
- param := defined.Parameters[i]
|
|
|
|
|
|
+ param := defined.Signature.Parameters[i]
|
|
expectedType := param.Type
|
|
expectedType := param.Type
|
|
if !expectedType.IsMatch(arg.Type()) {
|
|
if !expectedType.IsMatch(arg.Type()) {
|
|
return Fail(NewErrorValuef("Argument %d type mismatch: %s<->%s", i, expectedType, arg.Type()))
|
|
return Fail(NewErrorValuef("Argument %d type mismatch: %s<->%s", i, expectedType, arg.Type()))
|
|
@@ -187,7 +187,7 @@ func (defined *DefinedValue) Call(vm *VM, arguments ...Value) []Value {
|
|
func (defined *DefinedValue) Help() string {
|
|
func (defined *DefinedValue) Help() string {
|
|
help := defined.BasicCallable.Help()
|
|
help := defined.BasicCallable.Help()
|
|
extra := "["
|
|
extra := "["
|
|
- for _, parameter := range defined.Parameters {
|
|
|
|
|
|
+ for _, parameter := range defined.Signature.Parameters {
|
|
extra = fmt.Sprintf("%s %s %s", extra, parameter.Name, parameter.Type)
|
|
extra = fmt.Sprintf("%s %s %s", extra, parameter.Name, parameter.Type)
|
|
}
|
|
}
|
|
extra = extra + "]:"
|
|
extra = extra + "]:"
|
|
@@ -293,12 +293,12 @@ func (cv * CoverValue) AddOverload(name string, callable Callable, tv ... TypeVa
|
|
|
|
|
|
signature := Signature{}
|
|
signature := Signature{}
|
|
length := len(tv)
|
|
length := len(tv)
|
|
- if length > len(signature.Types) {
|
|
|
|
- length = len(signature.Types)
|
|
|
|
|
|
+ if length > len(signature.Parameters) {
|
|
|
|
+ length = len(signature.Parameters)
|
|
}
|
|
}
|
|
|
|
|
|
for i := 0; i < length; i++ {
|
|
for i := 0; i < length; i++ {
|
|
- signature.Types[i] = tv[i]
|
|
|
|
|
|
+ signature.Parameters[i].Type = tv[i]
|
|
}
|
|
}
|
|
|
|
|
|
cv.Overloads[signature] = Overload { Name: name, Callable: callable }
|
|
cv.Overloads[signature] = Overload { Name: name, Callable: callable }
|
|
@@ -651,8 +651,8 @@ func (vm *VM) RegisterBuiltin(name string, handler Handler) Value {
|
|
return vm.Register(name, value)
|
|
return vm.Register(name, value)
|
|
}
|
|
}
|
|
|
|
|
|
-func (vm *VM) RegisterDefined(name string, params []*Parameter, block *BlockValue, level int) Value {
|
|
|
|
- value := NewDefinedValue(name, params, block)
|
|
|
|
|
|
+func (vm *VM) RegisterDefined(name string, signature *Signature, block *BlockValue, level int) Value {
|
|
|
|
+ value := NewDefinedValue(name, signature, block)
|
|
return vm.RegisterUp(name, value, level)
|
|
return vm.RegisterUp(name, value, level)
|
|
}
|
|
}
|
|
|
|
|