【问题标题】:Need to create a Lua function dynamically需要动态创建Lua函数
【发布时间】:2019-11-24 08:28:21
【问题描述】:

我正在尝试从另一个函数中“即时”创建一个 Lua 函数。新的 Lua 函数,被称为“fx”,应该对一个标量变量进行操作——比如说,x——并返回 f_x(x),其中 f_x(x) 可以是诸如“x+1”或“x”之类的东西^2”。重要的是,给出了函数名“fx”(因为它将在其他函数中使用这个名称),但它的属性——特别是它是否返回“x+1”或“x^2”——应该可以动态修改。

假设“x”是标量值输入变量,“y”是包含指令的字符串,例如“x+1”或“x^2”,“fx”应该强加在“x”上。我天真地尝试过

function make_func (x,y)
   return ( function fx(x) return y end )
end

但这不起作用。

任何帮助和指导将不胜感激!

【问题讨论】:

  • "被称为 "fx"" Lua 中的函数并没有真正的名字。您的make_func 只是将函数存储在名为“make_func”的全局表条目中,但函数本身可以独立存在。那么,您是要创建一个存储在名为“fx”的全局变量中的函数,还是要将其存储在哪里?
  • @NicolBolas - 对于无意的含糊之处,我深表歉意。我想使用一个名为“fx”的全局函数名。

标签: function lua


【解决方案1】:

不清楚“fx”应该如何进入图片,但如果你有一个包含潜在可执行 Lua 代码的字符串(如果在存在“x”的上下文中编译的 Lua 表达式),那么这似乎是一个从 Lua 代码构建字符串并执行它的简单案例:

function make_func (x, lua_op)
   return dostring("return function(x) return " .. lua_op .. " end")
end

这需要lua_op 存储一个合法的Lua 表达式字符串。

如果要将函数存储在全局变量“fx”中,可以在返回之前进行:

function make_func (x, lua_op)
   fx = dostring("return function(x) return " .. lua_op .. " end")
   return fx
end

【讨论】:

  • 非常感谢!一个(希望很容易回答)后续问题:我是否需要加载库才能访问dostring?我问的原因是我不使用独立的 Lua 程序,而是使用嵌入 Lua 的 LuaTeX。 LuaTeX 似乎无法原生识别 dostring
  • @Mico:那你就得查一下 LuaTeX 的文档了。如果它没有为您提供dostringloadstring 或类似的编译工具,那么您不能这样做。
  • @Mico 也看看有没有load函数,这就是loadstring在5.3中的调用
  • 我认为您的答案符合要求,但对x 的更好解释是x 是结果函数中的形式参数,并且可以在 y(正文代码)中使用。它会影响 x 的任何外部使用。
猜你喜欢
  • 2011-03-08
  • 1970-01-01
  • 2022-01-02
  • 2013-07-30
  • 2015-02-18
  • 2019-02-09
  • 2013-06-04
  • 1970-01-01
  • 2019-06-12
相关资源
最近更新 更多