2012-07-25 73 views
1

我试图在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

1)Opa是一种功能语言, 因此,确实第一个例子在Opa中不合法。

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

没有声明变量x,但IDENT x和值['a', 'b', 'c']之间的绑定。

即使Opa是一种功能性语言,您也有可变的as you see on the OpaDoc。但是,正如你所知道的mutable值不是线程安全的,即你可以被抢占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)您可以将数据存储结构,仅单纯在数据库中。