Проблема связана с обработкой в глубину (используемой Pd) и связанной с этим разверткой стека, поскольку это может привести к установке второго входа [select]
на старое значение (которого вы не ожидали).
Пример
Примечание: select:in0
означает крайний левый вход [select]
, ... Числа, генерируемые [random]
, выделены жирным шрифтом (1
) и номера, выводимые патчем, выделены жирным курсивом (например, 3
)
Представьте, что [select]
инициализирован 0
и объект [random 3]
выводит список 2 0 0 2 0 2 ...
(подсказка: [seed 96(
).
Ожидаемый результат будет 2 0 2 0 2 ...
, однако на самом деле вывод 2 0 2 2 2 ...
Вот что происходит, если вы последовательно отправляете [bang(
в генератор случайных чисел:
random
генерирует 2
2
отправляется на sel:in0
, который сравнивает его с 0
(без совпадения) - и отправляет его из
sel:out1
(выход брака),отображение числа 2
- , после чего число отправляется на
sel:in1
, устанавливая его внутреннее состояние на 2
.
random
генерирует 0
0
отправляется на sel:in0
, который сравнивает его с 2
(нет совпадений) - и отправляет его из
sel:out1
, отображая после этого номер 0
- после этогономер отправляется на
sel:1
, устанавливая его внутреннее состояние на 0
.
random
генерирует 0
0
отправляется на sel:in0
, который сравнивает его с 0
(совпадение!) - и отправляет вызов через
sel:out0
(выход совпадения) - , инициируя новый вызовна
random
, который теперь генерирует 2
2
отправляется на sel:in0
, который сравнивает его с 0
(без совпадения) - и отправляет его из
sel:out1
, показывая номер 2
- , после чего номер отправляется на
sel:1
, установив его внутреннее состояние на 2
.
- , после этого число
0
(все еще ожидающее вe trigger:out0
) отправляется на sel:1
, устанавливая его внутреннее состояние на 0
!!!
random
создает 0
0
отправляется на sel:in0
, который сравнивает его с 0
(соответствует!) - и отправляет вызов через
sel:out0
- , инициируя новый вызовна
random
, который теперь генерирует 2
2
отправляется на sel:in0
, который сравнивает его с 0
- и отправляет егоиз
sel:out1
, отображая номер 2
- , после чего номер отправляется на
sel:1
, устанавливая его внутреннийукажите 2
.
- , после чего число
0
(все еще ожидающее в trigger:out0
) отправляется на sel:1
, устанавливая его как внутреннее0
!!!
Как видите, в конце # 3 внутреннее состояние [select]
равно 0
, хотя последнийчисло, сгенерированное [random]
, было 2
(поскольку крайний левый выход [trigger]
будет отправлять только на 0
после он отправил 2
из-за разворачивания стека).
Решение
Решение простое: убедитесь, что состояние [select]
содержитпоследнее отображаемое значение, а не последнее, сгенерированное в стеке.избегайте обратной связи при изменении внутреннего состояния.
Например (используя локальную отправку / получение для более хорошего ASCII-искусства)
[r $0-again]
|
[bang(
|
[random 3]
|
| [r $0-last]
| |
[select]
| |
| [t f f]
| | |
| | [s $0-last]
| |
| [print]
|
[s $0-again]