История изменений
Исправление den73, (текущая версия) :
Конс даёт возможность реализовать многоверсионную ассоциативную память на (полу-) иммутабельных структурах данных.
Например, как сделать биндинги переменных? Сначала в функции main создаём окружение (базу данных значений переменных),
окружение1 = ((моя-переменная . 1)), т.е. моя переменная равна 1.
Потом вызываем другую функцию и она временно связывает мою переменную в 2. Тогда окружение, хранящее значения переменных, будет в активации функции callee, вызываемой из main, выглядеть так:
((моя-переменная . 2) . окружение1) - т.е. мы ставим старое окружение (ссылку на него) как хвост уже существующего. При поиске текущего значения среда выполнения идёт по списку с головы и ищет конс-ячейку, в которой голова совпадает с именем переменной. Эта конс-ячейка и является хранилищем текущего значения переменной. Мутабельна она или нет - это другой вопрос, но изменения остаются в функции callee. Функция main не знает, что мы сослались на окружение1, и в ней моя-переменная будет равна 1, т.к. когда мы вернёмся из callee, мы просто забудем значение окружения, которое в ней было.
Таким способом можно реализовать специальные переменные - они как бы глобальные, но их можно локально связать с значением внутри функции и при выходе из функции будет восстановлено старое. Такая вот особая разновидность переменных, между локальными и глобальными, я встречал её только в лиспе и на самом деле она очень удобна, хотя сейчас считалась бы, наверное, дурным тоном.
Но общая идея такова - чистое ФП, многоверсионные базы данных. Слово «многоверсионное» тут главное. Новая версия базы данных создаётся путём добавления слоя изменений к уже существующей. Ты же вроде Хасклеист, должно быть тебе понятно. Ну или не ты Хаскелист, но не суть. В любом случае, тут не оптимизируешь как ты хочешь. Большой вектор копировать будет O(размер базы), а здесь содержание версии обходится в O(размер разницы между базами)
Исправление den73, :
Конс даёт возможность реализовать многоверсионную ассоциативную память на (полу-) иммутабельных структурах данных.
Например, как сделать биндинги переменных? Сначала в функции main создаём окружение (базу данных значений переменных),
окружение1 = ((моя-переменная . 1)), т.е. моя переменная равна 1.
Потом вызываем другую функцию и она временно связывает мою переменную в 2. Тогда окружение, хранящее значения переменных, будет в активации функции callee, вызываемой из main, выглядеть так:
((моя-переменная . 2) . окружение1) - т.е. мы ставим старое окружение (ссылку на него) как хвост уже существующего. При поиске текущего значения среда выполнения идёт по списку с головы и ищет конс-ячейку, в которой голова совпадает с именем переменной. Эта конс-ячейка и является хранилищем текущего значения переменной. Мутабельна она или нет - это другой вопрос, но изменения остаются в функции callee. Функция main не знает, что мы сослались на окружение1, и в ней моя-переменная будет равна 1, т.к. когда мы вернёмся из callee, мы просто забудем значение окружения, которое в ней было.
Таким способом можно реализовать специальные переменные - они как бы глобальные, но их можно локально связать с значением внутри функции и при выходе из функции будет восстановлено старое. Такая вот особая разновидность переменных, между локальными и глобальными, я встречал её только в лиспе и на самом деле она очень удобна, хотя сейчас считалась бы, наверное, дурным тоном.
Но общая идея такова - чистое ФП, многоверсионные базы данных. Тут не оптимизируешь как ты хочешь.
Исходная версия den73, :
Конс даёт возможность реализовать многоверсионную ассоциативную память на (полу-) иммутабельных структурах данных.
Например, как сделать биндинги переменных? Сначала в функции main создаём окружение (базу данных значений переменных),
окружение1 = ((моя-переменная . 1)), т.е. моя переменная равна 1.
Потом вызываем другую функцию и она временно связывает мою переменную в 2. Тогда окружение, хранящее значения переменных, будет в активации функции callee, вызываемой из main, выглядеть так:
((моя-переменная . 2) . окружение1) - т.е. мы ставим старое окружение как хвост уже существующего. При поиске текущего значения среда выполнения идёт по списку с головы и ищет конс-ячейку, в которой голова совпадает с именем переменной. Эта конс-ячейка и является хранилищем текущего значения переменной. Мутабельна она или нет - это другой вопрос, но изменения остаются в функции callee.
Таким способом можно реализовать специальные переменные - они как бы глобальные, но их можно локально связать с значением внутри функции и при выходе из функции будет восстановлено старое. Такая вот особая разновидность переменных, между локальными и глобальными, я встречал её только в лиспе и на самом деле она очень удобна, хотя сейчас считалась бы, наверное, дурным тоном.
Но общая идея такова - чистое ФП, многоверсионные базы данных. Тут не оптимизируешь как ты хочешь.