5

我真的很喜欢Lua作为一种编程语言,但是,我不得不不断地local为我的所有局部变量输入“”,这让我难以置信。

它只会让我的代码看起来更混乱。

所以我想知道,我是否可以在 Lua 之上创建一个领域特定语言(DSL)来简单地具有以下变量命名约定。

  1. 如果变量名全部大写,那么它是一个全局变量
  2. 否则,变量是local变量

问题:这行得通吗?是或否?

换句话说:

-- In Lua 5.2
isGlobalinLua  = "is global in default Lua"
GLOBALVAR      = "is global var in default Lua"
local localvar = "is local var in default Lua"

-- In my DSL Lua language
isLocalinDSLLua = "is local in DSL Lua"  -- translates to: local isLocalinDSLLua = ...
GLOBALVAR       = "is global DSL Lua"
localvar        = "is local var in DSL Lua"  -- translates to: local localvar = ...

所以现在,默认 Lua 中的以下代码:

myglobal = 10
local a = 1
if a > 1 then
    local b = 2
    print b
else
    local c = 3
    print c + myglobal
end

使用我的 DSL Lua:

MYGLOBAL = 10
a = 1
if a > 1 then
    b = 2
    print b
else
    c = 3
    print c + MYGLOBAL
end

更新

局部函数呢?

以下代码将如何工作?

myfunc = function (...)   -- local myfunc = function (...)

我不确定我是否想让每个全局函数都大写。

也许我只是忽略函数并需要' local'标识符......想法?

4

3 回答 3

5

由于您想要的更改相对简单,因此您基本上有两种选择。你可以试试Metalua

Metalua 是一种语言和编译器,它提供...

  • 一个完整的宏系统,功能类似于 Lisp 方言或 Template Haskell 提供的功能;被操纵的程序可以被视为源代码、抽象语法树或它们的任意组合,以更适合您的任务为准。
  • 一个动态可扩展的解析器,它允许您使用与语言的其余部分完美融合的语法来支持您的宏。

或者您可以使用令牌过滤器

令牌过滤器的工作原理是让您有机会在来自词法分析器的令牌流进入解析器之前检查和更改它们。你只能看到标记,你只能生成标记——你不能看到进入词法分析器的文本,也不能生成进入词法分析器的文本。

两种方法都有其优点和缺点。Metalua 允许您在 Lua 中进行高级语言修改,但学习曲线更陡峭。令牌过滤器允许您对令牌流进行简单的修改,但功能有限(请参阅2005 年的谈话)。

我不确定令牌过滤器是否足以满足您的情况,因为local在分配中的每个小写起始标识符之前插入仅适用于简单情况。下面的代码呢?

a = 1
a = a * a

你想把它转换成一个local,还是你想要两个?

local a = 1     vs.    local a = 1
a * a                  local a = a * a  -- valid in Lua, creates a new variable
于 2012-03-16T22:02:21.737 回答
3

Moonscript已经默认所有变量都是本地的,你只需要使用 export 关键字来声明一个全局变量。这是一种非常好的下一代,类似咖啡脚本的语言,它可以编译为 Lua。我在以前使用 Lua 的任何地方都使用它。

foo = 'bar' -- local
square (x) -> x*x -- local

-- globals
export square
export MY_GLOBAL = 12

export class Foo
    new: (bar) => @bar = bar -- self.bar = bar
    get_bar: => @bar
于 2013-04-06T21:46:06.587 回答
3

是的,您可以这样做,但结果不称为“特定领域的语言”。它被称为“预处理器”。

我也曾经被 Lua 的一个问题所困扰——它缺少switchorcase语句。实际上,我最终修改了实现以支持此功能。但最终我决定我不在乎用只有我使用的方言编程。

如果你有 C 编程技能,Lua 的实现是非常干净的,你实现目标的最简单的方法可能就是修改实现。

于 2012-03-17T01:48:34.083 回答