Помимо общего вопроса в названии,
Я спрашиваю об этом, узнав, как создатель Clojure Рич Хики специально стремился укротить «случайную сложность» объектно-ориентированного программирования. -программирование и изменяемое состояние, например Разделение личности и состояния в Clojure имеет большой смысл (файл ants.clj Хикки находится в списке для изучения).Другая связанная с этим область - использование функционального программирования для игр, которые часто представляют собой симуляции с множеством постоянно отслеживаемых "вещей" повсюду; есть несколько статей / статей о ФП и играх, хотелось бы больше.
Возможно, опытные функциональные программисты могут предоставить дополнительную информацию и советы о том, как переориентировать мышление на функциональный стиль, особенно для моделирования. Заранее спасибо!
Дядя Боб в последнее время играл с Clojure и, в частности, писал орбитальный симулятор в качестве своего наиболее публичного примера.
Некоторые ссылки:
Я не уверен, что смогу составить всесторонний анализ проблемы, поставленной в вопросе, но я могу по крайней мере опубликовать несколько интересных ссылок на FP vs . games front:
Йорг В. Миттаг приводит ряд интересных примеров в этом ответе на вопрос о "реальном" программировании на Haskell (со ссылками на некоторые интересные статьи - ] Чисто функциональные Retrogames действительно стоит прочитать).
В стране Clojure Фил Хагельберг реализовал текстовую приключенческую игру для своего PeepCode скринкаста по программированию на Clojure; код доступен на GitHub . Еще есть проект Брайана Карпера РПГ ; код еще не опубликован, и только одна публикация, сделанная некоторое время назад (хотя это выглядело очень круто, так что давайте все вместе, чтобы оказать давление на Брайана, чтобы он продолжил ;-)). Наконец, здесь пример простой игры, использующей Penumbra (по какой-то причине - возможно, не связанной с Clojure - я не смог заставить ее работать, но, возможно, вы это сделаете, плюс есть запись - вверх прилагается).
Что касается моделирования, изучение ants.clj
- отличная идея.Кроме того, я помню, как видел серию лекций на основе SICP из вводного курса программирования в Калифорнийском университете в Беркли (я думаю ...?), Доступных где-то (90% это было на их канале YouTube); у них есть три лекции по ООП в Scheme, и я думаю они упоминают моделирование как область, обеспечивающую хорошие варианты использования этого подхода. Обратите внимание, что я довольно смутно помню об этом, поэтому мне трудно сказать, насколько он может быть полезен для вас.
Михал ответил превосходно, но я подумал, что добавлю еще пару интересных примеров, которые я лично считаю полезными / интересными.
Первый - это сообщение (и код) о функциональной гидродинамике Лау Дженсона. Хотя здесь он определенно идет по изменчивому пути к скорости, стиль довольно функциональный. Готов поспорить, что с помощью Clojure 1.3 это можно будет сделать (в большинстве случаев!) Неизменно с разумной производительностью.
Далее идет простая игра «Змейка» , реализованная на Clojure. Достаточно легко читать через час или около того, и стиль действительно приятный и цельный.
Кроме того, неплохой код (я думаю!) - это нейронные сети, моделирующие код. У Джеффа Фостера есть однослойный код персептрона и еще несколько идиоматических изменений кода . Стоит посмотреть, даже если вы не знакомы с NN. У него также есть несколько недавних сообщений о динамике жидкости, но на этот раз на Haskell. ( Часть I и Часть II ) Я также думаю, что интересным является его реализация Игры Жизни (& Часть II ) .
Наконец, как передо мной упомянул Михал, Брайан Карпер работает над ролевой игрой на Clojure . он недавно опубликовал несколько иллюстраций для игры, так что я уверен, что над ним все еще работают;)
Мне нравится использовать библиотеки последовательностей для работы с тоннами данных; кажется более естественным использование таких абстракций, как map
и reduce
, и забавных, удобных инструментов, таких как juxt
, а не простых императивных итераций. Я обнаружил, что вы платите налог, используя Clojure / функциональные языки для повторной реализации хорошо известных и хорошо реализованных императивных алгоритмов.
Удачи!
Симуляции - это разновидность интерпретатора, который легко написать в функциональном стиле. Их также можно спроектировать как самооптимизирующиеся симуляторы , если рассматривать их как компилятор.
Я пишу игру на Clojure, используя в основном функциональный стиль. Например, все состояние игры моделируется как неизменная структура данных.
Это потребовало немного запутанного кодирования. Например, вы часто создаете функции с множеством параметров для передачи различных элементов состояния игры и обеспечения применения обновлений состояния игры к самой последней версии игры.
Но он также дал некоторые действительно приятные преимущества, например, параллелизм оказался довольно тривиальным, и вы можете делать забавные вещи, такие как клонирование всего состояния игры для запуска различных симуляций в AI.
В целом, я в восторге от Clojure как языка для симуляторов / игр.
Основываясь на этом опыте, я думаю, что вещи, которые могут улучшить Clojure для игр / симуляторов, следующие:
Вы можете увидеть раннюю версию игры здесь: Ironclad - Generals of Steam . По сути, это стратегическая игра в стиле стимпанк.