Примеры HsLua на Haskell Wiki не работают (dostring и dofile не определены).Похоже, API изменился с тех пор, как были написаны примеры.
Однако я пытался изменить примеры в соответствии с текущим API и не добился большого успеха.Вот программа, которая должна действительно работать!
main = do
l <- Lua.newstate
Lua.openlibs l
Lua.loadfile l "configfile.lua"
[name,pwd] <- Lua.callfunc l "getuserpwd" "mail.google.com"
putStrLn name
Lua.close l
Однако, она даже не компилируется, давая мне это странное сообщение об ошибке -
No instance for (Lua.StackValue [String])
arising from a use of `Lua.callfunc'
Possible fix:
add an instance declaration for (Lua.StackValue [String])
In a stmt of a 'do' expression:
[name, pwd] <- Lua.callfunc l "getuserpwd" "mail.google.com"
In the expression:
do { l <- Lua.newstate;
Lua.openlibs l;
Lua.loadfile l "configfile.lua";
[name, pwd] <- Lua.callfunc l "getuserpwd" "mail.google.com";
.... }
In an equation for `main':
main
= do { l <- Lua.newstate;
Lua.openlibs l;
Lua.loadfile l "configfile.lua";
.... }
В то время каксодержимое файла configfile.lua
, вероятно, не имеет значения (потому что код на haskell даже не компилируется), как показано ниже (так же, как на вики-странице) -
function getuserpwd (site)
local cookies = { ["www.ibm.com"] = {"joe", "secret"}
, ["www.sun.com"] = {"hoe", "another secret"}
}
if cookies[site] then
return cookies[site]
elseif site:match("[.]google[.]com$") then
return {"boss", "boss"}
else
return { os.getenv("USER") or "God"
, os.getenv("PWD") or "dontdisturb" }
end
end
Может кто-нибудь предоставитья с рабочим примером вызовов Haskell-> Lua и Lua-> Haskell?
Edit
Хорошо, я изменил тип возвращаемого значения на String (сранний массив String), и эта программа компилирует !Однако теперь это терпит неудачу во время выполнения.Вот измененная программа -
main = do
l <- Lua.newstate
Lua.openlibs l
Lua.loadfile l "configfile.lua"
Lua.callfunc l "getuserpwd" "mail.google.com" >>= putStrLn
Lua.close l
А вот configfile.lua -
function getuserpwd (site)
return "boss"
end
А сообщение об ошибке во время выполнения выглядит следующим образом -
**** Exception: user error (attempt to call a nil value)