首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我的Lua DSL会有用吗.?(这似乎太简单了,不可能是真的)

我的Lua DSL会有用吗.?(这似乎太简单了,不可能是真的)
EN

Stack Overflow用户
提问于 2012-03-16 21:26:12
回答 3查看 883关注 0票数 5

我真的很喜欢Lua作为一种编程语言,但是,不得不不断地为我的所有局部变量键入"local“,这让我感到很困扰。

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

因此,我想知道,我能否在Lua的基础上创建一个域特定语言(DSL),以便具有以下变量命名约定。

  1. 如果变量名以所有大写字母表示,那么它就是一个全局变量
  2. 否则,变量就是local变量。

问题:这有用吗?是的还是不是?

换言之:

代码语言:javascript
运行
复制
-- 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代码如下:

代码语言:javascript
运行
复制
myglobal = 10
local a = 1
if a > 1 then
    local b = 2
    print b
else
    local c = 3
    print c + myglobal
end

我的DSL Lua:

代码语言:javascript
运行
复制
MYGLOBAL = 10
a = 1
if a > 1 then
    b = 2
    print b
else
    c = 3
    print c + MYGLOBAL
end

更新

当地的活动呢?

下面的代码将如何工作?

代码语言:javascript
运行
复制
myfunc = function (...)   -- local myfunc = function (...)

我不确定我是否想用所有的大写来做所有的全局函数。

也许我只是忽略了函数而需要“local”标识符..。有什么想法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-06 21:46:06

默认情况下,月脚本已经拥有所有本地变量,您只需要使用export关键字来声明全局变量。这是一个非常好的下一代,类似coffeescript的语言,它编译成Lua。我把它用在我以前用过的地方。

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2012-03-16 22:02:21

由于您想要的更改相对简单,您基本上有两个选择。你可以试试梅塔鲁阿

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

  • 一个完整的宏系统,类似于Lisp方言或模板Haskell;操纵的程序可以被看作是源代码、抽象语法树,或者是任意的混合,无论哪个更适合您的任务。
  • 一个动态可扩展的解析器,它允许您使用与语言其他部分很好地混合的语法来支持宏。

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

令牌过滤器的工作方式是让您有机会在从lexer到解析器之前检查和更改来自它们的流。你只能看到标记,你只能生成标记--你不允许看到文本进入词汇,也不允许生成文本进入词汇。

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

我不确定令牌过滤器对您的情况是否足够,因为在赋值中的每个小写开始标识符之前插入local只适用于简单的情况。下面的代码呢?

代码语言:javascript
运行
复制
a = 1
a = a * a

您想要将其转换为单个local,还是要两个?

代码语言:javascript
运行
复制
local a = 1     vs.    local a = 1
a * a                  local a = a * a  -- valid in Lua, creates a new variable
票数 5
EN

Stack Overflow用户

发布于 2012-03-17 01:48:34

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

我也曾被Lua的一个问题所困扰--它缺少switchcase语句。实际上,我最终修改了实现,以支持这个特性。但最终我决定我不想用方言编程,只有我才会用方言编程。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9744732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档