github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/object/reflect/string.go (about) 1 package reflect 2 3 import ( 4 "reflect" 5 6 "github.com/hirochachacha/plua/internal/tables" 7 "github.com/hirochachacha/plua/object" 8 "github.com/hirochachacha/plua/object/fnutil" 9 ) 10 11 func buildStringMT() { 12 mt := tables.NewTableSize(0, 7) 13 14 mt.Set(object.TM_METATABLE, object.True) 15 mt.Set(object.TM_NAME, object.String("STRING*")) 16 mt.Set(object.TM_TOSTRING, tostring(toString)) 17 mt.Set(object.TM_INDEX, index(toString)) 18 19 mt.Set(object.TM_EQ, cmp(func(x, y reflect.Value) bool { return x.String() == y.String() }, toString)) 20 mt.Set(object.TM_LT, cmp(func(x, y reflect.Value) bool { return x.String() < y.String() }, toString)) 21 mt.Set(object.TM_LE, cmp(func(x, y reflect.Value) bool { return x.String() <= y.String() }, toString)) 22 23 mt.Set(object.TM_CONCAT, binary(func(x, y reflect.Value) (reflect.Value, *object.RuntimeError) { 24 return reflect.ValueOf(x.String() + y.String()), nil 25 }, toString, mt)) 26 27 stringMT = mt 28 } 29 30 func toString(ap *fnutil.ArgParser, n int) (reflect.Value, *object.RuntimeError) { 31 val, err := toValue(ap, n, "STRING*") 32 if err != nil { 33 return reflect.Value{}, err 34 } 35 if val.Kind() != reflect.String { 36 return reflect.Value{}, ap.TypeError(n, "STRING*") 37 } 38 return val, nil 39 }