Предполагая, что не существует какая-либо текущая переменная привязки, команда
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
, становится общий результат из-за того, как работает andalso
. Как только этот результат будет доступен, привязки для правой стороны будут отброшены, потому что все, что необходимо, является результатом. Исходные привязки все еще вокруг из-за левой стороны, и эти привязки остаются в силе. Последующая команда b()
для отображения привязок, следовательно, по-прежнему показывает One = 1
.
Очень похожий эффект происходит, если вы запустите это:
4> true andalso (Two = 2).
2
5> b().
One = 1
ok
Вторая часть andalso
, (Two = 2)
, добавляет привязку для Two
только креплениями для той части оценки. Результат, 2
, сохраняется, но привязки для этой части отбрасываются, и только привязки для левой половины остаются в силе. Когда мы снова запустим b()
, чтобы увидеть все привязки, мы по-прежнему видим только One = 1
.
Посмотрите это: http://erlang.org/doc/reference_manual/expressions.html#id81160 –
@Atomic_alarm, что именно? ... это на самом деле моя точка, второе выражение было оценено, я знаю это, потому что оно вернуло 'ok', но переменная не была несвязана. я что-то упускаю? – yeyo