我真的很喜欢Lua作为一种编程语言,但是,不得不不断地为我的所有局部变量键入"local
“,这让我感到很困扰。
这只会让我的代码看起来更混乱。
因此,我想知道,我能否在Lua的基础上创建一个域特定语言(DSL),以便具有以下变量命名约定。
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
”标识符..。有什么想法?
发布于 2013-04-06 21:46:06
默认情况下,月脚本已经拥有所有本地变量,您只需要使用export关键字来声明全局变量。这是一个非常好的下一代,类似coffeescript的语言,它编译成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
发布于 2012-03-16 22:02:21
由于您想要的更改相对简单,您基本上有两个选择。你可以试试梅塔鲁阿
Metalua是一种语言和编译器,提供.
或者您可以使用令牌过滤器
令牌过滤器的工作方式是让您有机会在从lexer到解析器之前检查和更改来自它们的流。你只能看到标记,你只能生成标记--你不允许看到文本进入词汇,也不允许生成文本进入词汇。
这两种方法各有优缺点。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-17 01:48:34
是的,你可以这样做,但结果不是一种“特定于领域的语言”。它被称为“预处理器”。
我也曾被Lua的一个问题所困扰--它缺少switch
或case
语句。实际上,我最终修改了实现,以支持这个特性。但最终我决定我不想用方言编程,只有我才会用方言编程。
如果您有C编程技能,那么Lua实现是非常干净的,实现目标的最简单方法可能就是修改实现。
https://stackoverflow.com/questions/9744732
复制相似问题