Как уже отмечалось, особенностью функционального программирования является отсутствие оператора присваивания. Передача данных между функциями осуществляется через их аргументы и возвращаемые результаты. Однако в ряде случаев было бы удобно хранить и передавать информацию с помощью структур данных, доступных всем функциям программы.
В языке Рефал-2 рефал-машина, кроме поля памяти и поля зрения, имеет ещё одно запоминающее устройство, называемое копилкой. Копилка является некоторым аналогом глобальных переменных в императивных языках программирования, она даёт возможность именовать и хранить рефал-выражения, предоставляя доступ к ним из любой точки программы.
Копилка содержит последовательность структурных термов вида:
(имя1'='выражение1)(имя2'='выражение2)...(имяN'='выражениеN)
где имя1, имя2, ..., имяN и выражение1, выражение2, ..., выражениеN – произвольные объектные выражения. Единственное ограничение, накладываемое на выражения имя1, имя2, ..., имяN – они не могут содержать на верхнем уровне символ-литеру '='.
Смысл копилки и том, что в ней под именами имя1, имя2, ..., имяN закопаны соответственно рефал-выражения выражение1, выражение2, ... , выражениеN. Перед началом работы программы копилка пуста.
Работа с копилкой осуществляется с помощью встроенных функций Br (Burry – закопать), Dg (Dig Out – выкопать), Cp (Copy – скопировать), Rp (Replace – заменить) и Dgall (Dig Out All – выкопать всё). Все эти функции, кроме функции Cp, имеют побочный эффект – они меняют содержимое копилки.
Обращение к функции Br имеет вид имя'='выражение>, при его вычислении в поле зрения сам этот вызов заменяется пустым выражением, а содержимое копилки изменяется – в начало содержащейся в копилке последовательности термов добавляется терм (имя'='выражение), т.е. аргумент функции Br, заключенный в структурные скобки.
Обращение к функции Dg имеет вид имя>. Эта функция просматривает содержимое копилки от начала в конец в поисках терма вида (имя'='выражение) и если находит его, удаляет этот терм из копилки. Результатом обращения к функции является выражение, оно заменяет в поле зрения исходное функциональное обращение. Если же указанный терм в копилке не найден, то в качестве результата выдается пустое выражение.
Функция Cp имеет тот же формат, что и Dg, и работает аналогичным образом, за исключением того, что содержимое копилки не меняется, т.е. найденный терм (имя'='выражение) остается в копилке.
Обращение к встроенной функции Rp имеет вид |