Как применять clojure? [закрыто]

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

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

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

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

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

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

23
задан Arjan Tijms 22 July 2013 в 08:14
поделиться

4 ответа

В ответ на «предысторию» вопроса:

Я думаю, вам следует прочитать ответ Йорга В. Миттага на вопрос SO, озаглавленный «Программирование на Haskell в реальном мире». Он делает ряд отличных замечаний. Читайте о моем взгляде на FP в реальном мире; прокрутите горизонтальную линию, чтобы найти ответы на два актуальных вопроса.

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

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


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

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

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

17
ответ дан 29 November 2019 в 02:16
поделиться

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

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

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

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

9
ответ дан 29 November 2019 в 02:16
поделиться

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

5
ответ дан 29 November 2019 в 02:16
поделиться

Я думаю, что ответ на этот вопрос во многом зависит от контекста, в который встроен ваш проект, и от ограничений, которые на вас накладываются. В отсутствие социальных факторов я думаю, что 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, включая Clojure, особенно если они не слишком увлечены этой идеей.

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

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

3
ответ дан 29 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: