为什么这个表达式不解除绑定变量?
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
.
最近我开始学习 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
.