Лучший способ автоматически конвертировать исходный код Clojure в исходный код Java - PullRequest
18 голосов
/ 02 июля 2011

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

Ответы [ 4 ]

17 голосов
/ 03 июля 2011

Лучше всего, как отмечали другие, использовать декомпилятор байт-кода.Вам все еще понадобятся классы clojure.Но, что более важно, если ваша цель - генерировать Java-код, который должен обрабатываться Java-программистами, маловероятно, что вы добьетесь успеха.

Clojure - это не просто «Java с другим синтаксисом».Его языковые конструкции настолько отличаются от java, что многие идиоматические Clojure будут выглядеть в Java очень чуждо.

Даже если ваш код Java будет выглядеть более или менее читабельным, ваши Java-разработчики будут невероятно разочарованы.По сути, им по-прежнему нужно программировать на Лиспе, но использовать синтаксис Java и очень странные конструкции: это будет беспорядок.

Если вы хотите использовать Clojure в команде разработчиков Java, я бы попробовалразработать и упаковать ваш код Clojure в виде jar-файла с четко определенным Java-APIРазработчики Java были бы счастливы, потому что это просто еще одна библиотека Java, и вы будете счастливы, потому что напишите правильный код Clojure.

8 голосов
/ 06 июля 2011

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

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

«Цель этого кода состоит в том, чтобы обнулить аргументы, предотвращающие« удержание головы »в случае рекурсивного вызова функции.» Из выступления Джорджа Джахада о декомпиляции классов clojure. http://georgejahad.com/clojure/clojureDecompiled.html

8 голосов
/ 02 июля 2011

Я бы попытался сгенерировать файл .class из .clj, а затем декомпилировать его в .java с помощью декомпилятора, например, JAD.

4 голосов
/ 02 июля 2011

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

Если это для ваших собственных программ, то вы, вероятно, можете жить с очень небольшим подмножеством полного Clojure, и вы, вероятно, сможете справиться с небольшим генератором программ.

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