LINUX.ORG.RU

История изменений

Исправление 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.

Таким способом можно реализовать специальные переменные - они как бы глобальные, но их можно локально связать с значением внутри функции и при выходе из функции будет восстановлено старое. Такая вот особая разновидность переменных, между локальными и глобальными, я встречал её только в лиспе и на самом деле она очень удобна, хотя сейчас считалась бы, наверное, дурным тоном.

Но общая идея такова - чистое ФП, многоверсионные базы данных. Тут не оптимизируешь как ты хочешь.