func string__concat(L *lua.State) int {
	v1, t1 := luaToGoValue(L, 1)
	v2, t2 := luaToGoValue(L, 2)
	s1 := valueToString(L, v1)
	s2 := valueToString(L, v2)
	result := s1 + s2

	if t1 == t2 || isPredeclaredType(t2) {
		v := reflect.ValueOf(result)
		makeValueProxy(L, v.Convert(t1), cStringMeta)
	} else if isPredeclaredType(t1) {
		v := reflect.ValueOf(result)
		makeValueProxy(L, v.Convert(t2), cStringMeta)
	} else {
		L.PushString(result)
	}

	return 1
}
func string__concat(L *lua.State) int {
	v1, t1 := luaToGoValue(L, 1)
	v2, t2 := luaToGoValue(L, 2)
	s1 := valueToString(L, v1)
	s2 := valueToString(L, v2)
	result := s1 + s2

	if t1 == t2 || isPredeclaredType(t2) {
		v := reflect.ValueOf(result)
		makeValueProxy(L, v.Convert(t1), cStringMeta)
	} else if isPredeclaredType(t1) {
		v := reflect.ValueOf(result)
		makeValueProxy(L, v.Convert(t2), cStringMeta)
	} else {
		L.PushString(result)
	}

	return 1
}
func string__concat ( L * lua . State ) int { v1 , t1 := luaToGoValue ( L , 1 ) v2 , t2 := luaToGoValue ( L , 2 ) s1 := valueToString ( L , v1 ) s2 := valueToString ( L , v2 ) result := s1 + s2 if t1 == t2 || isPredeclaredType ( t2 ) { v := reflect . ValueOf ( result ) makeValueProxy ( L , v . Convert ( t1 ) , cStringMeta ) } else if isPredeclaredType ( t1 ) { v := reflect . ValueOf ( result ) makeValueProxy ( L , v . Convert ( t2 ) , cStringMeta ) } else { L . PushString ( result ) } return 1 }
// Lua accepts concatenation with string and number.
Lua accepts concatenation with string and number .