Название протокола Clojure{Script}
Какой идиоматический способ назвать протокол Clojure?IProtocol
или же Protocol
или они представляют разные варианты использования и почему?
Пока пользуюсь IProtocol
при работе с совместимостью (Java или js/google-closure в ClojureScript).
Меня также интересует соглашение об именах имен методов:-my-method
против my-method
, Я видел как в дикой природе (в кодовой базе ClojureScript), и не мог придумать обоснование, чтобы объяснить, когда использовать один или другой.
Итак, каков идиоматический способ именования абстракций в Clojure и ClojureScript?
1 ответ
Да, это способ, которым вы позволяете java
звонить clojure
код.
Если вы создаете, например, lein new app testapp
(lein
интерфейс командной строки для leiningen
широко используемый инструмент автоматизации проектов clojure) вы можете увидеть в своем core.clj строку
(ns testapp.core
(:gen-class))
(defn -main
"Comment line"
[&args]
(println "Hello, World!"))
Вот ns
это макрос, который облегчает определение пространств имен и других вещей. Важная вещь здесь (:gen-class)
, Позвольте развернуть макрос:
> (macroexpand-1 '(ns testapp.core (:gen-class)))
(do
....
(clojure.core/gen-class :name "testapp.core" :impl-ns testapp.core :main true)
....)
Этот код сообщит компилятору сгенерировать байтовый код для класса с именем "testapp.core", и этот класс будет помечен как ":main true". Этот знак создаст объявление статического public main
функция в классе, так jvm
может запустить программу, вызывающую main
функция. По соглашению на языке Java точка входа в программу должна называться main
, Вы можете добавить различные методы gen-class
(см. документы) объявление типов или аргументов и возвращаемого значения, но, как я могу предположить, это может быть полезно для разделения java
статически типизированные методы из вашего clojure
функции для предотвращения коллапса имени. Так gen-class
позволяет определить :prefix
что вы используете, чтобы назвать свою реализацию класса Java. По умолчанию один "-". Итак, вы создаете функцию -main
И в java
код это будет выглядеть testapp.core.main
,
Мы можем изменить это
(ns testapp.core
(:gen-class :prefix my-prefix-))
Когда вы компилируете свой код в jar и запускаете с java -jar
ты получаешь
Exception in thread "main" java.lang.UnsupportedOperationException:
testapp.core/my-prefix-main not defined
Хорошо, мы забыли переименовать нашу реализацию:
(defn my-prefix-main [&args] (println "Hello, World!"))
Скомпилируйте и запустите:
"Hello, World!"
PS Я не могу рассказать вам о соглашениях об именах протоколов и интерфейсов, которые используются в clojure
,