修改封闭范围中的变量

时间:2011-08-25 21:42:59

标签: scope opa

语言中存在一个常见问题,即假设变量声明是本地的。你如何得到封闭范围内的变量。

Opa有办法吗?

例如:

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未使用namestart@toplevel的值永远不会更改。

在像Lua,Javascript或Scheme这样的语言中,有明确的局部标记,因此可以在范围堆栈中找到未以这种方式标记的变量。在Python中没有这样的标记,所以这是不可能的。在Python中你可以得到全局(顶层)变量,我也在Opa中找到了{{1}}指令。但我对范围链中的中间点感兴趣。

当然,有一些解决方法,通过使用记录,但是有直接途径吗?

2 个答案:

答案 0 :(得分:3)

一种解决方案是使用参考模块:

Reference.create,Reference.get,Reference.set

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

答案 1 :(得分:1)

弗雷德的答案中提到的参考模块确实是一个解决方案,它最接近你所要求的。

但是,知道在编写“正确的方式”时,也可以在Sessions中捕获Opa程序中的大多数状态,并通过发送给它的消息触发会话状态的更改。