dc unix: сохранение начального значения даже после сохранения нового значения в том же индексе массива
Я не могу понять этот пример, приведенный на странице руководства dc
:
$ dc
1 0:a 0Sa 2 0:a La 0;ap
1
Для меня ответ должен быть 2, потому что:
1 0:a
Здесь мы храним 1 на 0-й позиции массиваa
,0Sa
Теперь мы помещаем 0 в стек регистраa
,2 0:a
Теперь здесь снова мы храним 2 в 0-й позиции массиваa
тем самым перезаписывая предыдущий 1, сохраненный в этом месте.La
Теперь мы выталкиваем 0 хранится в стеке регистраa
и поместите его в основной стек.0;a
Теперь мы снова помещаем 0 в основной стек, а затем выталкиваем его для использования в качестве индекса массива и таким образом помещаем 2, хранящийся в 0-м месте массиваa
в основной стек.p
Теперь мы печатаем верхнюю часть основного стека, равную 2. Поэтому ответом должно быть 2.
Что мне не хватает?
Редактировать:
$ dc -V
dc (GNU bc 1.06.95) 1.3.95
1 ответ
Объяснение, приведенное перед примером в справочной странице:
Обратите внимание, что каждый составной экземпляр регистра имеет свой собственный массив, связанный с ним.
Другими словами, когда вы используете команды массива и команды стека в одном и том же регистре, вы создаете двумерную структуру. Команды массива работают с записями в верхнем ряду, а команды стека работают с целыми строками.
Кроме того, "скалярное" значение записи стека, полученное с помощью l
а также L
Команды полностью отделены от массива, а не просто псевдоним для 0-го элемента. (Я не получил это со страницы руководства, но, похоже, это правда в моих экспериментах.)
Вот команды в примере с результирующими значениями a
расширен в подробный формат. Самая внешняя структура - это стек, причем верхняя часть указана первой.
Начальное значение всех регистров:
[
{ scalar: undefined, array: [] }
]
1 0:a
[
{ scalar: undefined, array: [1] }
]
0 Sa
[
{ scalar: 0, array: [] },
{ scalar: undefined, array: [1] }
]
2 0:a
[
{ scalar: 0, array: [2] },
{ scalar: undefined, array: [1] }
]
La
[
{ scalar: undefined, array: [1] }
]
(Верхняя запись выскочила. Ее скалярное значение, 0
, был передан в основной стек, и его значение массива, [2]
был отброшен.)
0;a
[
{ scalar: undefined, array: [1] }
]
(The ;
Команда не изменяет регистр, просто копирует 0-ую запись массива в основной стек. Поскольку массив [1]
это кладет 1
на вершине основного стека.)