dc unix: сохранение начального значения даже после сохранения нового значения в том же индексе массива

Я не могу понять этот пример, приведенный на странице руководства dc:

$ dc  
 1 0:a 0Sa 2 0:a La 0;ap  
 1  

Для меня ответ должен быть 2, потому что:

  1. 1 0:a
    Здесь мы храним 1 на 0-й позиции массива a,

  2. 0Sa
    Теперь мы помещаем 0 в стек регистра a,

  3. 2 0:a Теперь здесь снова мы храним 2 в 0-й позиции массива a тем самым перезаписывая предыдущий 1, сохраненный в этом месте.

  4. La
    Теперь мы выталкиваем 0 хранится в стеке регистра a и поместите его в основной стек.

  5. 0;a
    Теперь мы снова помещаем 0 в основной стек, а затем выталкиваем его для использования в качестве индекса массива и таким образом помещаем 2, хранящийся в 0-м месте массива a в основной стек.

  6. 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 на вершине основного стека.)

Другие вопросы по тегам