在opa中实现回调

时间:2012-07-25 00:59:15

标签: opa

我正在尝试在opa中实现回调,因此当变量在服务器端更新时,客户端会立即获得更新的值。

我知道我可以用网络做到这一点:

Network.add_callback(update_function, room)

然而,作为一个学习练习,我想自己实现这个功能。

我的第一个想法是创建一个void->void函数列表list(void->void),这是我在缺少可变状态和变量时遇到的第一个问题。所以我无法在创建的列表中添加任何回调函数。

这引出了我的第一个问题:我如何处理没有可变状态?我不认为自己是函数式编程的新手,但通常我会重新赋值变量

x = ['a','b','c']
function addVal(val){
    x = List.add(val,x)
}

但这在opa中似乎不合法。

如何在没有变量或可变数据结构的情况下工作?我没有看到在没有可变状态的情况下如何实现任何动态内容。

我决定通过在数据库中存储我的回调函数列表来解决这个问题:

database callbacks{
  list(void -> void) functions
}

但我收到了错误

Elements of type void -> void cannot be stored in the database

这引出了我的第二个问题:

是否有比doc.opalang.org更好的opa资源?我无法找到有关数据库中允许的类型的任何信息。

总结如下:

  1. 如何在不使用可变状态或变量的情况下构建实际执行任何操作的程序?
  2. opa数据库中允许哪些类型?
  3. doc.opalang.org以外的opa是否有任何有用的资源?

2 个答案:

答案 0 :(得分:3)

并为Quentin回答:

添加示例

答案 1 :(得分:2)

1)Opa是一种函数式语言, 因此,确实第一个例子在Opa中是不合法的。

x = ['a', 'b', 'c']

不声明变量x,而是声明x和值['a', 'b', 'c']之间的绑定。

即使Opa是一种功能语言,你也有可变的as you see on the OpaDoc。 但是你知道可变值不是线程安全的,即你可以被抢占beetwen get和set,暗示你的状态不一致。

因此,要解决此问题,您可以使用Session。基本上,会话是状态和消息处理程序。会话处理程序是线程安全执行的,以更新会话状态。会话可以被任何系统实体无缝地序列化和操作的另一个优点。

你的例子可以写成:

// A channel which can receive add message 
channel({string add}) s = Session.make(['a', 'b', 'c'], 
      function(oldstate, message){
        match(message){
          case {add : value} : {set : List.add(value, oldstate)} //setting the new state
          .... // other message
        }
      }
    )

function addVal(value){
  Session.send(s, {add : value}
}

2)您只能在数据库中存储纯粹的数据结构。