Изменение переменной во вложенной области видимости - PullRequest
2 голосов
/ 26 августа 2011

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

Есть ли способ в Опа?

Например:

start() = 
    name = Random.string(5)

    set_name(new_name) = 
        old_name = name
        name = new_name
        log("User {old_name} changed name to {new_name}")

Это не работает. Мы получаем предупреждение о том, что name не используется в set_name, а значение name в start никогда не изменяется.

В таких языках, как Lua, Javascript или Scheme, существует явная маркировка локальных элементов, поэтому переменные, не помеченные таким образом, можно найти в стеке областей действия. В Python нет такой маркировки, и поэтому это было бы невозможно. В Python вы можете получить глобальные (toplevel) переменные, и я нашел директиву @toplevel в Opa. Но меня интересуют промежуточные пункты в цепочке прицелов.

Конечно, есть обходные пути с использованием записей, но есть ли прямой маршрут?

Ответы [ 2 ]

3 голосов
/ 26 августа 2011

Одним из решений является использование модуля Reference:

Reference.create, Reference.get, Reference.set

http://opalang.org/resources/doc/index.html#stdlib.core.reference.opa.html/!/value_stdlib.core.Reference

1 голос
/ 26 августа 2011

Ссылочный модуль, упомянутый в ответе Фреда, действительно является одним из решений этого, и он наиболее близок к тому, что вы просите.

Но также полезно знать, что при программировании «правильного пути» большая часть состояния вваша Opa-программа будет захвачена в сеансах с изменением состояния сеанса, вызванным отправленным ей сообщением.

...