Изучение Clojure без [закрытого] ведома Java

Просто добавление к исходному ответу. Хотя это будет работать:

MethodInfo method = typeof(Sample).GetMethod("GenericMethod");
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);

Также немного опасно, что вы теряете проверку времени компиляции для GenericMethod. Если вы позже выполните рефакторинг и переименуете GenericMethod, этот код не заметит и не будет работать во время выполнения. Кроме того, если есть какая-либо пост-обработка сборки (например, обфускация или удаление неиспользуемых методов / классов), этот код также может сломаться.

Итак, если вы знаете метод, с которым вы связываетесь во время компиляции , и это не называется миллионы раз, поэтому накладные расходы не имеют значения, я бы изменил этот код:

Action<> GenMethod = GenericMethod<int>;  //change int by any base type 
                                          //accepted by GenericMethod
MethodInfo method = this.GetType().GetMethod(GenMethod.Method.Name);
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);

Хотя вы не очень красивы, у вас есть ссылка времени компиляции на GenericMethod здесь, и если вы рефакторируете, удаляете или делаете что-либо с помощью GenericMethod, этот код будет продолжать работать или, по крайней мере, ломаться во время компиляции (если, например, вы удалите GenericMethod).

Другой способ сделать то же самое - создать новый класс-оболочку и создать его через Activator. Я не знаю, есть ли лучший способ.

17
задан Steve Rowe 11 February 2009 в 04:37
поделиться

6 ответов

Моя основная рекомендация для Вас, Вы уже выполнили путем покупки Программирующий Clojure. Я избежал и ненавидел Java в течение многих лет и лет и (Программирования), Clojure реабилитировал его достаточно, что язык теперь волнует меня. Who'd've думал, что заметно обременительная система позволит Вам в интерактивном режиме (map #(.getName %) (.getMethods (class "")))? Просмотрите "Работу с Java, 3.5 Добавляющими Проектами Муравья и Задачами к Скальпелю" для исследования в стиле, что я знаком с от Ruby.

, Если Вы находитесь в Freenode #clojure, также присоединитесь к ##java. Получите Java документация API и сохраните это удобным. Ищите сеть ответ Java к чему-то, что Вы хотите сделать и перевести его более или менее непосредственно к Clojure.

РЕДАКТИРОВАНИЕ: В clj:

user=> (use 'clojure.contrib.javadoc)
nil
user=> (keys (ns-publics 'clojure.contrib.javadoc))
(*remote-javadocs* javadoc find-javadoc-url add-remote-javadoc
*core-java-api* add-local-javadoc *local-javadocs*)
user=> (javadoc "this is a java.lang.String")
true  (browses to http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html)
user=> (javadoc java.net.ServerSocket)
true  (...)
user=>
19
ответ дан 30 November 2019 в 10:43
поделиться

Вообще-то, хотя Clojure был разработан с учётом разработчиков Java, он был не написано для Java-программистов.

Clojure спроектирован так, чтобы хорошо взаимодействовать в среде Java.

Хотя это и так, это не то, для чего он был разработан (по крайней мере, не в языковой части «среды Java»). А «среда Java» подразумевает, что язык и JVM каким-то образом связаны между собой, что делает их единым целым. Они не. Conjure - это родной язык JVM (в отличие от Jython или JRuby), и он использует очень хорошо построенную виртуальную машину, чтобы жить в ней.

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

Нет, извините. Clojure не был «построен, чтобы быть с Java». Он был построен для JVM. Вы можете использовать библиотеки Java, если хотите, но это не обязательно (хотя это полезно). А также совет использовать другой Lisp, если вы не хотите изучать Java. Это нелепо. Clojure не должен быть Java; это должен быть Лисп 1-го класса. И, между прочим, это означает, что нужно усовершенствовать Лисп, сделать его более современным и функциональным. Его способность хорошо работать с Java должна рассматриваться как бонус, а не как обязательство.

Как указывает выше Грег, такие языки, как Clojure и Groovy, ориентированы на JVM по одной основной причине, так что разработчики Java могут получить лучшее из обоих миров.

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

Я просто закончу цитатой Рика Хики (парня, который написал Clojure):

«Вы можете ненавидеть Java и любить JVM».

Далее он говорит, что именно там он стоит.

22
ответ дан 30 November 2019 в 10:43
поделиться

Никакое преступление Greg, но я не соглашаюсь. Изучение Clojure является идеальным шансом получить что-то вроде схватывания на мире Java также. Я никогда не программировал в Java день в своей жизни, и я изучаю Clojure и люблю каждую минуту его. Конечно, я не знаю все классы, но мне не удается видеть, где книга предполагает знание их всех. Так или иначе Java не является требованием для изучения Clojure.

9
ответ дан 30 November 2019 в 10:43
поделиться

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

Как Greg сказал, хотя, Clojure создается, чтобы быть с Java, и если Вы не хотите действительно войти в программное обеспечение Clojure транзакционная система памяти, я сказал бы для проверки другого Lisp. Java, конечно, не требуется, но это - огромный участок для не изучения стандартных библиотек сверху стандартных библиотек Clojure.

1
ответ дан 30 November 2019 в 10:43
поделиться

Как Greg выше указывает, языки как , Clojure и Groovy нацелены на JVM по одной главной причине, так, чтобы у Java-разработчиков мог быть лучший из оба миры. Так, если бы Вы хотите изучить Lisp, Схема или язык Common LISP были бы большим запуском!

0
ответ дан 30 November 2019 в 10:43
поделиться

Если бы Вы не интересуетесь всеми аспектами Java Clojure, возможно, Вы были бы более обеспеченным изучением другого диалекта Lisp, такого как язык Common LISP или Схема. Clojure разработан для взаимодействия хорошо в среде Java.

-1
ответ дан 30 November 2019 в 10:43
поделиться
Другие вопросы по тегам:

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