Как написать буфер в функциональном программировании - PullRequest
0 голосов
/ 02 августа 2020

Во время принудительного перерыва я решил вернуться к трассировщику лучей, но для разницы я решил сделать это с помощью функционального программирования, а не обязательного.

Однако у меня есть проблема: как у вас есть закадровый буфер?

У меня есть класс colour, и буфер будет массивом из colour объектов, но если объект colour неизменяемый, вы не можете просто обновить объект новым цветом.

Итак, я думал о массиве shared_ptr s, но он заменяется на неизменяемый буфер.

Итак, мой последний способ - сделать полосы из 16 (может быть, больше, может быть меньше) colour объектов и имеют связанный список между ними, и когда изображение будет завершено, скопируйте буферы в закадровый буфер и переверните его.

Это лучший способ сделать это, или мне здесь не хватает трюка?

1 Ответ

1 голос
/ 04 августа 2020

Я ничего не знаю о вашем домене графических буферов, но вы можете искать постоянную структуру данных : структуру данных, которая обеспечивает эффективное неизменяемое обновление лучше, чем копирование при записи .

Clojure, IMHO, имеет одну из лучших реализаций неизменяемых векторов и словарей в своей стандартной библиотеке, основанную на попытках сопоставления массива . См. здесь для более подробного объяснения и возможных оптимизаций.

Кроме того, существует метод, называемый переходные процессы , который позволяет отказаться от неизменяемости локально для эффективных разработчиков, и затем может быть заморожен в неизменяемой структуре перед передачей результата. Это немного похоже на вашу идею.

Однако знайте, что реализация приложений с отслеживанием состояния с большими неизменяемыми структурами данных не должна быть самоцелью, если только вы не хотите оставаться чистыми по конкретной причине. Это здорово, когда вы передаете вещи между подобными акторам компонентами, не беспокоясь о ссылочной прозрачности или потокобезопасности, но, возможно, в меньшей степени для обновления l oop через буфер. (Это просто ответ на ваш комментарий «что я могу принести в свою повседневную работу».)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...