func mbStringGetRev(s string, index, length int) rune {
	i := lisp.Length(s) - 2
	ch := lisp.ArefString(s, lisp.Length(s)-1)
	size := utf8CharWidth(ch)
	offset := length - size - 1
	for offset >= index {
		ch = lisp.ArefString(s, i)
		size = utf8CharWidth(ch)
		offset -= size
		i--
	}
	return utf8DecodeByte(ch, (index-offset)-1, size)
}
Part of MbStringGet implementation.
String traversal is done in reverse order.
package rt
import (
	"emacs/lisp"
)
func StringGet(s string, index int) rune {
	if !lisp.IsMultibyteString(s) {
		return lisp.ArefString(s, index)  
	}
	return MbStringGet(s, index)
}
func MbStringGet(s string, index int) rune {
	length := lisp.StringBytes(s)
	if index <= length {
		return mbStringGetFwd(s, index)
	}
	return mbStringGetRev(s, index, length)
}
func mbStringGetFwd(s string, index int) rune {
	i := 1                       
	ch := lisp.ArefString(s, 0)  
	size := utf8CharWidth(ch)    
	offset := size               
	for offset <= index {
		ch = lisp.ArefString(s, i)
		size = utf8CharWidth(ch)
		offset += size
		i++
	}
	return utf8DecodeByte(ch, size-(offset-index), size)
}