Название протокола 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,

Другие вопросы по тегам