2014-02-11 74 views
2

我需要构建一个用户友好的方式来在Lua中声明图。将创建这些图表的用户是通常不了解Lua语言的计算机科学家。描述Lua中的图形结构

目前,图形只是普通表格。一个例子(不工作):

local x = "some text" 
local a_graph = { 
    a = 1, 
    b = { 
    c = x 
    }, 
    c = { 
    k = b 
    } 
} 

上述图描述的工作版本应该足以建立其中“K = b”被替换为“K =参考至b”的曲线图(是的,“ b“包含在”a_graph“中)。我可以轻松编写函数进行查找(递归访问父母并查看他们的直接孩子),但我的问题是检测并存储“b”是参考。 我还需要允许“c = x”,其中x是现有变量。

我得出两个解决方案:

  1. 使用功能围绕基准,本身写成的文字,例如 'K = REF( “B”)'。 我不喜欢这个解决方案,因为它对我的用户来说很容易出错(他们可能会忘记“ref”或引号)。

  2. 当全局查找失败时,对_G或_ENV的__index进行覆盖以返回某些内容。 我测试了它,它工作,但似乎很奇怪。

有没有另一种解决方案?

+3

图可以有循环(它可以不是树)?你的'a_graph' Lua表编码了什么图形? –

+3

你看过graphviz吗?它既是一个命令行工具,它对于最终用户来说也具有非常直观的简单输入文件格式,以及一个DLL。如果你确实需要Lua,Lua绑定graphviz就会存在luagraph。 – Schollii

+0

我个人发现你的第一个解决方案没有错。如果您花时间记录如何使用'ref()'函数,那么您可能更有价值,而不是花时间去开发新的DSL(涉及所有的捕获)。你将不得不维护更少的代码。专注于制作优秀的图形应用程序! :) – MBlanc

回答

1

我认为最直接的解决方案是在一些愚蠢的表中编码图结构,并使用构造函数将这些表转换为您喜欢的内部图数据结构。构造函数也可以以简单的方式进行错误处理,因为它可以查看所有输入(而不是像ref函数那样本地化)。

将输入表示与最终结果分开还可以让您拥有多种表示形式。例如:

local graph_1 = adjacency_list { 
    a = {'b'}, 
    b = {'a', 'c'}, 
    c = {'a'}, 
} 

local graph_2 = list_of_edges { 
    {'a', 'b'}, 
    {'b', 'a'}, 
    {'b', 'c'}, 
    {'c', 'a'}, 
} 

local graph_2 = adjacency_matrix { 
    {0, 1, 0}, 
    {1, 0, 1}, 
    {1, 0, 0}, 
} 
+1

图也可以用字符串定义:'local graph_4 = graph“a-b> c> a”' –