2012-07-25 66 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)您可以將數據存儲結構,僅單純在數據庫中。