Подтвердить что ты не робот

Как применить clojure?

Я изучаю Clojure, и я действительно люблю некоторые его функции. Пришло время подумать о некоторых реальных "домашних проектах", и я понимаю, что не знаю, как на самом деле использовать Clojure.

Я вижу много веб-шаблонов и шаблонов (например, Compojure), но почему-то я сомневаюсь, стоит ли это. Я чувствую, что в конечном итоге он не может удовлетворить потребности приложений реального мира, которые вы адресуете с помощью Spring, Hibernate и некоторых частей стека Java EE.

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

Достаточно, мои вопросы:

  • Каковы возможные приложения Clojure и функционального программирования? Какую идею для проекта для домашних животных вы можете предложить, не переписывая материал, который я делал с OO/Java EE, в другой синтаксис? Я ищу что-то, что действительно использует потенциал Clojure и приводит к решению, которое чувствует себя намного лучше (не только в синтаксисе), чем OO/структурное программирование.
  • Является ли распространенным или, по крайней мере, разумным, сочетание Clojure и Java? Я имею в виду использование Clojure для крошечных библиотек в 95% проектах Java или создание Java-приложений поверх ядра, написанного в Clojure.

Изменить: Спасибо за все замечательные ответы. Они все очень вдохновляют. Поэтому, если у вас есть что-то еще, чтобы добавить, продолжайте и не отвлекайтесь на тот факт, что он принят.

4b9b3361

Ответ 1

В ответ на "второстепенную" часть вопроса:

Я думаю, вы должны прочитать Jörg W. Mittag ответ на вопрос SO, озаглавленный "Программирование реального мира Haskell". Он делает несколько отличных моментов. Читайте дальше для моего вступления в FP в реальном мире; прокрутите горизонтальную линию для ответов на два актуальных вопроса.

Существует ряд компаний, ориентированных на FP, которые, похоже, действительно хороши в том, что они делают; для некоторых примеров, google Jane Street (OCaml), Galois (Haskell), FlightCaster (Clojure для тяжелого подъема бэкэнда, я, кажется, помню, что их интерфейс в настоящее время выполняется в Rails). Предположительно автоматизированные торговые стратегии часто кодируются в языках, ориентированных на FP; это действительно имеет смысл, хотя у меня нет внутренних данных, чтобы подтвердить это. Дополнительные примеры, связанные с Clojure, см. список компаний на странице историй успеха.

Некоторые люди, похоже, пользуются успехом в удовлетворении потребностей приложений реального мира в Rails, Django и т.д. Похоже, что им не нужно прикасаться к J2EE и друзьям. Не то чтобы они имеют много общего с FP, но они похожи на FP, поскольку они не похожи на "Языки предприятия" настоящего.


Что касается двух актуальных вопросов:

Почему бы просто не подобрать то, что вы в последний раз думали делать, и делать это в Clojure? Очевидно, что все может быть сделано на Java (и, возможно, большинство вещей было), но более компактный язык может сделать продукт более чистым, более приятным и менее трудоемким и т.д.

О смешивании Clojure и Java - я видел приличное количество кода Clojure, используя пару классов, закодированных непосредственно на Java (по какой-либо причине). Я попытался пойти другим путем вокруг себя, и это немного больно в том, что гораздо проще работать с наследованием интерфейса, чем наследование класса в Clojure, неожиданная связь в коде Java может серьезно помешать возможности Clojure, чтобы делать что-то самым естественным образом и т.д. Тем не менее, вполне возможно расширить Java-программу в Clojure, и это кажется особенно безопасным и разумным способом экспериментировать с ним для обеспокоенного Java-разработчика.

Ответ 2

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

Очень часто смешивается Clojure и Java, поскольку Clojure не имеет большого количества выделенных библиотек для таких операций, как I/O или сеть.

Организации, которые уже имеют много Java-кода, могут использовать Clojure для небольших подразделов своих проектов Java.

Для новых проектов обычно более эффективно использовать Clojure как язык драйвера высокого уровня, при необходимости вызывая библиотеки Java.

Ответ 3

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

Ответ 4

Я думаю, что ответ на этот вопрос имеет большое значение для контекста, в который встроен ваш проект, и ограничений, которые налагаются на вас. Отсутствие социальных факторов. Я думаю, что Clojure, по крайней мере, как "хороший" язык, поскольку Java для любой проблемы, за исключением случаев, когда вам нужен последний бит производительности. И даже в этих случаях все не так просто, как кажется. С одной стороны, некоторая будущая версия Clojure, возможно, в теоретическом пределе должна быть скомпилирована в байт-код, который является "быстрым", как то, что скомпилировано в Java (при условии, что у программиста будет более сложная работа на узких местах.) Что еще более важно, оптимизация - это многофакторная проблема, и в ней важна производительность программиста и гибкость кодовых факторов. Поэтому, хотя есть смысл, в котором было бы точно сказать, что Clojure медленнее, чем Java, этот смысл не может быть важным при обсуждении производительности конкретного приложения.

Итак, я бы сказал, что если вы игнорируете социальные факторы Clojure, то случаи использования близки к надмножеству Java. Я бы не стал писать Linux-модуль ядра в Clojure, хотя...

Конечно, верно, что не все проблемы имеют одинаково естественные решения в функциональных языках. Но люди придумали некоторые интересные способы решения некоторых из случаев, когда FP, похоже, плохо относится к домену, и в любом случае Clojure на самом деле предлагает вам достаточное количество выходов из чистого FP, если вы действительно чувствуете необходимость писать часть вашей программы в императивном стиле вы можете (хотя, конечно, вы откажетесь от некоторых преимуществ Clojure в этом случае.) В худшем случае вы можете использовать Clojure для диска Java-библиотеки почти так же, как вы бы на Java... трудно представить себе случай, когда это будет хорошей идеей, но в большинстве случаев это не будет заметно хуже, чем просто использование Java, и во многих это может быть лучше.

Я все еще неофит на Clojure, хотя я долго программировал CL и схему, и я потратил около пяти лет на то, чтобы писать Java для жизни. Но я, вероятно, предпочел бы Clojure для Java практически для чего угодно, даже не зная об этом, если бы не было социальных факторов.

Было бы ошибкой отклонять социальные факторы. Я был программистом Lisp достаточно долго, чтобы иметь точно отточенный инстинкт о том, насколько хорошо Lisp будет работать в данном контексте. Я ввел Lisp в коммерческие настройки, где он был большой победой, и я представил его в настройках, где это действительно не так. Я думаю, долго и упорно о провешивания своей карьеры на успешно переходит в команду программистов для любого Lisp, Clojure включены, в частности, если они не слишком увлечены идее.

Просто, чтобы дать вам представление о том, что, на мой взгляд, может быть полезно Clojure, в настоящее время я пишу много кода, связанного с покером, в Clojure. Некоторые из них - довольно простые вещи (поиск лучших пяти карт, которые вы можете сделать из семи карт), и некоторые из них немного интереснее (глядя на кого-то, кто играет в историю и извлекает из нее значимые тенденции, используя несколько эвристик и некоторую базовую статистику.) Ничто из этого не требует многого для Clojure сложных concurrency механизмов, но по-прежнему намного лучше (по крайней мере для меня) в Clojure, чем в, скажем, в Java.

Конечно, есть некоторые другие случаи, когда кто-то может описать, где Clojure выигрывает большой из-за его сложных механизмов управления concurrency и т.д. Я нацелен на что-то более скромное - я просто указываю, что даже если вы "Мне нужны эти механизмы, вы могли бы найти Clojure очень подходящий язык для программирования общего назначения, хотя и тот, который требует от вас переосмыслить, как вы абстрагируете вещи, если вы исходите из фона императива /OO. И, если вам нужны механизмы concurrency (как вы могли бы, как это происходит), по крайней мере, вы уже знаете Clojure.

Ответ 5

Мне нравится писать игровые программы, когда я изучаю новый язык.

Я участвую в процессе обучения Clojure и начал писать пасьянс Паука. Если вы никогда не играли в Spider, не начинайте; он очень аддитивен:-). См. http://www.spidersolitaire.org/.

При написании этой игры я хочу использовать несколько вещей, которые я хочу изучить: функциональное программирование, concurrency, Java-interop (для Swing) и т.д.

Я также начал писать игрока Bejeweled (http://www.popcap.com/games/free/bejeweled2), но столкнулся с проблемой нахождения окончательных правил для подсчета очков.