mirror of
https://codeberg.org/scip/rpnc.git
synced 2025-12-17 12:31:04 +01:00
added lua interpreter support for custom math functions
This commit is contained in:
72
go/interpreter.go
Normal file
72
go/interpreter.go
Normal file
@@ -0,0 +1,72 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
lua "github.com/yuin/gopher-lua"
|
||||
)
|
||||
|
||||
// LUA interpreter, instanciated in main()
|
||||
var L *lua.LState
|
||||
|
||||
var LuaFuncs map[string]int
|
||||
|
||||
// called from lua to register a 1 arg math function
|
||||
func RegisterFuncOneArg(L *lua.LState) int {
|
||||
function := L.ToString(1)
|
||||
LuaFuncs[function] = 1
|
||||
return 1
|
||||
}
|
||||
|
||||
// called from lua to register a 1 arg math function
|
||||
func RegisterFuncTwoArg(L *lua.LState) int {
|
||||
function := L.ToString(1)
|
||||
LuaFuncs[function] = 2
|
||||
return 1
|
||||
}
|
||||
|
||||
func InitLua(L *lua.LState) {
|
||||
LuaFuncs = map[string]int{}
|
||||
L.SetGlobal("RegisterFuncOneArg", L.NewFunction(RegisterFuncOneArg))
|
||||
L.SetGlobal("RegisterFuncTwoArg", L.NewFunction(RegisterFuncTwoArg))
|
||||
|
||||
if err := L.CallByParam(lua.P{
|
||||
Fn: L.GetGlobal("init"),
|
||||
NRet: 0,
|
||||
Protect: true,
|
||||
}); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func CallLuaFunc(L *lua.LState, funcname string, a float64, b float64) (float64, error) {
|
||||
if LuaFuncs[funcname] == 1 {
|
||||
// 1 arg variant
|
||||
if err := L.CallByParam(lua.P{
|
||||
Fn: L.GetGlobal(funcname),
|
||||
NRet: 1,
|
||||
Protect: true,
|
||||
}, lua.LNumber(a)); err != nil {
|
||||
fmt.Println(err)
|
||||
return 0, err
|
||||
}
|
||||
} else {
|
||||
// 2 arg variant
|
||||
if err := L.CallByParam(lua.P{
|
||||
Fn: L.GetGlobal(funcname),
|
||||
NRet: 1,
|
||||
Protect: true,
|
||||
}, lua.LNumber(a), lua.LNumber(b)); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
|
||||
// get result and cast to float64
|
||||
if res, ok := L.Get(-1).(lua.LNumber); ok {
|
||||
L.Pop(1)
|
||||
return float64(res), nil
|
||||
}
|
||||
|
||||
return 0, errors.New("function did not return a float64!")
|
||||
}
|
||||
Reference in New Issue
Block a user