Serialization 支持序列化协同程序的语言
我认为目前的语言中不存在这样的支持。我想我想做的事情可以通过一个“工作流引擎”来解决。但工作流的问题通常是:Serialization 支持序列化协同程序的语言,serialization,programming-languages,dsl,coroutine,Serialization,Programming Languages,Dsl,Coroutine,我认为目前的语言中不存在这样的支持。我想我想做的事情可以通过一个“工作流引擎”来解决。但工作流的问题通常是: 声明式/冗长式,我发现命令式风格更简洁 重量级,我会有很多简单但多样的小状态机 我已经调查过了,但这并没有让我真正达到我想要的目的。我目前正在考虑在中整合一个DSL,但不确定是否能够将类似于协同路由的行为纳入Boo,并将其序列化 例子 下面是我想做的有限的虚构例子。主要问题是,在例程的任何时候,您都可能需要获得用户输入。输入之间的时间可能很长,因此服务状态需要序列化到磁盘 def
def RunMachine(user)
var lever = user.ChooseLever()
lever.Pull()
var device = CreateDevice(user)
machine.Add(device)
machine.Run()
def CreateDevice(user)
var color = user.ChooseColor()
var shape = user.ChooseShape()
return Device(color, shape)
更新
我在CPython有一个工作的“引擎”。它依赖于python中的迭代器/产量支持。代码如下所示:
def escape(self, you):
roll = yield self.game.rollDice(you)
if roll < 5:
self.caughtAction(you)
def dumpGameState(game):
if gameState.partialState:
return pickle.dumps({ 'partialState': game.partialState, 'partialInputs': game.partialInputs })
return pickle.dumps(game)
def loadGameState(data):
state = pickle.loads(data)
if state.__class__ is Game:
return state
r = pickle.loads(state['partialState'])
for input in state['partialInputs']:
game.execute(**input)
return game
当前调查
我仍然觉得这不能令人满意。因为我最终不得不在几乎所有方法上使用“收益率”。我不想专门装饰一个方法。此外,它在序列化方面也相当失败
目前,我正在研究一种函数式方法,因为函数式语言似乎对元编程/DSL创建有更好的支持。目前正在考虑
- 哈斯克尔
我希望有了足够强大的元编程工具,我可以自动化状态存储机制。此外,如果我选择F#路线,我很确定我可以依靠我用来序列化迭代器的方法。您可能想看看Windows工作流: 它的使用方式是这样的,能够在工作流处于非活动状态时保持工作流,并能够重新启动工作流 虽然从技术上讲它不是语言支持,但它应该能够完成任务。您在寻找什么 在任何支持闭包的语言中,都可以编写延续传递样式的程序并手动实现call/cc
call/cc
beingcall with current continuation
有趣的是,你今天应该问这个问题,后来我读到了。看起来像是你想要的那种东西。特别是有一个参考,包括以下描述:
SecondLife要求代码为
在任何时间点暂停,并且
它的整个状态是可序列化的
转换成适合存储的格式
输入数据库。序列化状态
然后可以在不同的时间恢复
时间点或在不同的时间点
计算机(例如移动时
从一个节点到另一个节点)
除非我误解了您的意思,否则这可能是一个很好的探索途径。我发现对序列化的最好支持似乎是通过库在Lua中 我三年了,但不能让合作项目运作。然后我用Python/IronPython进行了一段时间的实验,但缺少序列化支持 现在有了Lua,我将不得不面对在Linux和Windows上工作的挑战,但最终如果我要寻找一种脚本语言来支持游戏,可能最好使用已经被广泛选择的语言 更新 我最终暂时放弃了Lua。我在集成问题上陷得太深了。我回到Python。我正在为我的合作计划使用,并且正在解决这个问题
在我的例子中,程序状态并不总是有活动的协程,这意味着有时我可以对状态进行pickle。否则,我将存储最后一个pickle状态,以及此后操作的“重播历史记录”。然后恢复状态就是取消勾选最后一个状态,并重播任何操作。最新版本的Java包括Rhino,一个支持可序列化连续化的javascript解释器。还有冥王星+卢阿,我正在调查
我想听听您最终选择了什么样的路径,因为可序列化的连续性对项目很重要。是的,我试图明确指出,我试图避免使用XML繁重、去极化的工作流引擎,例如Windows工作流。我相信协程是可以在连续性的基础上构建的。协同程序允许更自然地表达意图IMHO。但我回到这个问题,即使在语言中提供了延续支持,您能序列化它们吗?有些。例如,事实上,Seaside web框架的设计依赖于可序列化的continuations。这看起来很棒,或者至少它有最好的潜力。谢谢更新了我目前所在的位置的问题。我最终成功地使用了冥王星和Lua5.1。Lua5.2也有Eris,但我还没有尝试过。我最近让冥王星和Lua在我的延续序列化游戏引擎()中工作。