Реализация обратных вызовов в opa

Я пытаюсь реализовать обратные вызовы в opa, поэтому, когда переменная обновляется на стороне сервера, клиенты немедленно получают это обновленное значение.

Я знаю, что могу сделать это с сетью:

Network.add_callback(update_function, room)

однако в качестве учебного упражнения я хотел бы реализовать эту функцию самостоятельно.

Моей первой мыслью было создать список void->void функций list(void->void), и именно здесь я столкнулся со своей первой проблемой в отсутствии изменяемого состояния и переменных. Поэтому я не могу добавить какие-либо функции обратного вызова в созданный список.

Это приводит меня к моему первому вопросу: как мне работать без изменяемого состояния? Я не считаю себя новичком в функциональном программировании, но обычно я просто переназначаю переменную

i.e.

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

Но это не кажется законным в опа.

Как можно работать без переменных или изменяемых структур данных? Я не понимаю, как любой динамический контент может быть реализован без изменяемого состояния.

Я решил попытаться обойти проблему, сохранив свой список функций обратного вызова в базе данных:

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

но я получаю ошибку

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

Что приводит меня ко второму вопросу:

Есть ли лучшие ресурсы для opa, чем doc.opalang.org? Мне не удалось найти никакой информации о типах, разрешенных в базе данных.

Итак, вкратце:

  1. Как мне создать программу, которая действительно что-то делает без использования изменяемого состояния или переменных?
  2. Какие типы разрешены в OPAP-базах?
  3. Есть ли какие-нибудь полезные ресурсы для opa, кроме doc.opalang.org?

opa
person user1064799    schedule 25.07.2012    source источник


Ответы (2)


1) Opa — функциональный язык. Таким образом, первый пример действительно недопустим в Opa.

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

Объявляет не переменную x, а привязку между идентификатором x и значением ['a', 'b', 'c'].

Даже если Opa является функциональным языком, у вас есть изменяемый как вы видите в OpaDoc . Но, как вы знаете, изменяемое значение не является потокобезопасным, т.е. вы можете быть вытеснены между получением и установкой, что означает, что ваше состояние несовместимо.

Поэтому для решения этой проблемы вы можете использовать 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) В БД можно хранить только чисто структуру данных.

person Quentin Bourgerie    schedule 25.07.2012

И чтобы добавить примеры к ответу Квентина:

person Cédrics    schedule 25.07.2012