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

Лучший способ конвертировать Clojure Источник в источник Java автоматически

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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