关于构建可通过网络访问的多用户可编程交互式环境的一些问题

时间:2013-09-23 21:03:26

标签: parsing programming-languages sandbox mud

简介

我一直试图建立这个项目已经有好几个星期了,并尝试了多种我无法理解的解决方案。让我稍微描述一下这个项目。它是一个基于文本的服务器,玩家可以登录(通过telnet或客户端),基本上就像一个MUD。然后,他们可以创建“对象”并与之交互,为他们提供“动词”和“属性”。

服务器基本上只是“对象”的数据库,每个对象都有一个ID,一个名称,一个位置(这是另一个对象),一个内容(对象)列表和一些其他标志。对象可以有'动词'和'属性'。属性只是存储数据(string,int,float,w / e)。动词是方法/功能。使用诸如“将东西放入容器”之类的命令来交互对象。旧版本的服务器已经存在,它被称为LambdaMOO。我试图重新创建它,因为它还没有在很长很长的时间内更新。

您可以更深入地了解对象,动词和属性应如何工作:http://bit.ly/17XIqjY

示例

让我描述一下我想要的东西。想象一下,我们有一个对象。对象#256,它被称为“按钮”。它具有属性“count”以及从其父级继承的所有默认属性(即“描述”)。它上面有一个“动词”,叫做“推”。这个动词包含以下代码:

this.count += 1;
this.description = "This button has been pushed " + this.count + " times.";
player.tell("You press the button and feel a chill run down your spine.");

当玩家在服务器上键入“按钮”时,“推送”动词将运行并输出

You press the button and feel a chill run down your spine.

如果您在按钮处look,则会看到它的更新说明。

请注意,上述脚本中的player是指执行动词的播放器的对象。 tell是玩家对象上的另一个动词。但是tell动词有一个标志,表示它可以从其他动词执行。

用什么语言?

我的主要问题是我可以将哪些语言用于'动词'?我尝试过使用node.js和'vm'库。我尝试使用C#来解析C#。我已经尝试使用C#来解析JavaScript。我一直遇到的问题是我无法控制动词和属性的权限。如果我将它们转换为JavaScript中的文字函数,我无法确定它们正在运行的对象以及它应具有的权限。如果用户在另一个用户对象上调用一个函数,我无法拦截该调用并在权限不正确时停止该调用。关于动词代码使用哪种语言,我只是需要“沙盒化”,我并不感兴趣。属性只有在用户设置为可读/可写时才需要,与动词相同。我想我可以使用一种带有重载的语言(比如PHP的__get,__ set,__ call)。

我还需要能够将这些变量注入动词:(主要根据命令输入确定,除非动词是从另一个动词调用的)

player (object)          the player who typed the command
this (object)            the object on which this verb was found
caller (object)          this will be the same as ‘player’, unless another
                           verb calls the command in which case it is the object
                           containing that verb.
verb (string)            the first word of the command
argstr (string)          everything after the first word of the command
args (list of strings)   a list of the words in ‘argstr’
dobjstr (string)         the direct object string found during parsing
dobj (object)            the direct object value found during matching
prepstr (string)         the prepositional phrase found during parsing
iobjstr (string)         the indirect object string
iobj (object)            the indirect object value

我还需要能够从任何其他对象访问任何对象(只要权限可以解决)。

// Object #128. Verb: multiply   Prep: this none this   Perms: +r +x
return (args[0] * args[1]);

// Object #256. Verb: square     Prep: this none this   Perms: +r +x
return #128:multiply(args[0], args[0]);

// Object #512. Verb: touch      Prep: any any this     Perms: +r
// Has a property (int) 'size' on it.
this.size = #256:square(this.size);
this.description = "It's a large button, it spans " + this.size + " metres.";
player:tell("You touch the button, it gets bigger.");

然后用户可以push button并且按钮对象的大小属性将被平方。

推荐阅读

我强烈建议您阅读http://bit.ly/17XIqjY处的文档,以便更深入地了解系统应如何运作。

建议您阅读以下文档,因为μMOO基于LambdaMOO及其方法:

1 个答案:

答案 0 :(得分:1)

我把这个问题视为要求一种可以做你需要的语言。这就是我要回答的问题。

首先,这项任务绝对不适合任何主流或命令式语言,如C#或Java。我甚至都不会想到它。 Javascript是可能的,但不是它擅长的东西,没有什么特别推荐它。

其次,如果你有合适的技能,这将是一个设计一种全新语言并在接下来的一两年内开始工作的绝佳机会。人们真的这样做,但我不推荐它,除非你喜欢那种自虐的经历。 [我愿意。]

所以我的建议是,在找到匹配项之前,请扩大语言体验。在我熟悉的语言中,Ruby是最好先尝试的。一旦你说inject these variables into the verb,你就让我想起了Ruby,因为很多Ruby软件(包括Rails)都是这样构建的。忘记Python,Perl和Javascript:我真的不认为他们会破解它。

超越Ruby你可能会考虑Lua。我最近没有使用它,它可能不适合,但它被广泛用作游戏脚本语言。

除此之外,还有真正的功能语言。其中最古老的都是:Lisp。你可以在Lisp中做任何事情,包括首先实现你正在寻找的语言。然后是Scala和Haskell,仅举两例。他们需要学习,但很适合你遇到的那种问题。

答案不是很多,因为它基本上说:依次学习这些语言,直到找到适合你的语言。 [如果可以,我很乐意继续提供帮助。我对Moo有美好的回忆。]