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

Why this expression does not unbound the variable?

最近我开始学习 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> One = 1.

通过调用 erl_eval:add_binding('One',1,[]) 添加 One 的绑定,其中最后一个参数是当前绑定的列表。然后绑定是 [{'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}]) 的调用中,将仅右侧 的绑定 更改为空列表 []。由于 andalso 的工作方式,表达式那部分的结果 ok 成为整体结果。一旦该结果可用,右侧的绑定将被删除,因为所需要的只是结果。由于左侧的缘故,原始绑定仍然存在,并且这些绑定仍然有效。因此,随后显示绑定的 b() 命令仍然显示 One = 1.

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

4> true andalso (Two = 2).
2
5> b().
One = 1
ok

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