func freaddir(L *lua.LState) int {
	dir := L.CheckString(1)
	names := L.NewTable()
	dirEntries, err := os.ReadDir(dir)
	if err != nil {
		L.RaiseError(err.Error() + ": " + dir)
		return 0
	}
	for _, entry := range dirEntries {
		names.Append(lua.LString(entry.Name()))
	}
	L.Push(names)
	return 1
}
readdir(dir)
Returns a table of files in `dir`
package fs
import (
	"strconv"
	"os"
	"strings"
	"hilbish/util"
	"github.com/yuin/gopher-lua"
)
func Loader(L *lua.LState) int {
	mod := L.SetFuncs(L.NewTable(), exports)
	util.Document(L, mod, `The fs module provides easy and simple access to
filesystem functions and other things, and acts an
addition to the Lua standard library's I/O and fs functions.`)
	L.Push(mod)
	return 1
}
var exports = map[string]lua.LGFunction{
	"cd": fcd,
	"mkdir": fmkdir,
	"stat": fstat,
	"readdir": freaddir,
}
func fcd(L *lua.LState) int {
	path := L.CheckString(1)
	err := os.Chdir(strings.TrimSpace(path))
	if err != nil {
		e := err.(*os.PathError).Err.Error()
		L.RaiseError(e + ": " + path)
	}
	return 0
}
func fmkdir(L *lua.LState) int {
	dirname := L.CheckString(1)
	recursive := L.ToBool(2)
	path := strings.TrimSpace(dirname)
	var err error
	if recursive {
		err = os.MkdirAll(path, 0744)
	} else {
		err = os.Mkdir(path, 0744)
	}
	if err != nil {
		L.RaiseError(err.Error() + ": " + path)
	}
	return 0
}
func fstat(L *lua.LState) int {
	path := L.CheckString(1)
	pathinfo, err := os.Stat(path)
	if err != nil {
		L.RaiseError(err.Error() + ": " + path)
		return 0
	}
	statTbl := L.NewTable()
	L.SetField(statTbl, "name", lua.LString(pathinfo.Name()))
	L.SetField(statTbl, "size", lua.LNumber(pathinfo.Size()))
	L.SetField(statTbl, "mode", lua.LString("0" + strconv.FormatInt(int64(pathinfo.Mode().Perm()), 8)))
	L.SetField(statTbl, "isDir", lua.LBool(pathinfo.IsDir()))
	L.Push(statTbl)
	return 1
}