最近我开始学习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
为什么?
答案 0 :(得分:4)
假设当前没有变量绑定,则命令
1> One = 1.
通过调用One
为erl_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()
。