为什么这个表达式不解除变量?

时间:2015-09-26 22:47:15

标签: erlang

最近我开始学习Erlang,来自一个命令性的背景,事情有些不同......

我做得很好(学习Erlang)直到我在Eshell工作时遇到了一些我不理解的东西,有人能解释我发生了什么吗?

17> One.
1
18> One = 1.
1
19> true andalso f(One).
ok
20> One.
1

为什么One仍然绑定一个值?因为确实评估了表达式的右侧。现在,如果我单独使用f(),事情就会按预期工作

21> f(One).
ok
22> One.
* 1: variable 'One' is unbound

为什么?

1 个答案:

答案 0 :(得分:4)

假设当前没有变量绑定,则命令

1> One = 1.

通过调用Oneerl_eval:add_binding('One',1,[])添加绑定,其中最后一个参数是当前绑定的列表。然后绑定是[{'One',1}]

接下来,我们运行andalso表达式:

2> true andalso f(One).
ok
3> b().
One = 1
ok

此命令的作用是,在评估true时,绑定为[{One,1}]。由于true使andalso的左侧成功,然后评估右侧,同时使用[{One,1}]的绑定,并在f(One)命令结果在调用erl_eval:del_binding('One',[{'One',1}])时,仅将右侧的绑定更改为空列表[]。由于ok的工作方式,表达式{@ 1}}部分的结果成为整体结果。一旦结果可用,右侧的绑定就会被删除,因为所需的只是结果。由于左侧原始绑定仍然存在,并且这些绑定保持有效。因此,显示绑定的后续andalso命令仍显示b()

如果你运行它会发生非常类似的效果:

One = 1

4> true andalso (Two = 2). 2 5> b(). One = 1 ok 的第二部分andalso仅将(Two = 2)的绑定添加到评估部分的绑定中。结果Two被保留,但该部分的绑定被删除,只有左半部分的绑定保持有效。当我们再次运行2以查看所有绑定时,我们仍然只看到b()