Извините заранее за несколько дискурсивный характер этой совокупности связанных вопросов; Я надеюсь, что ответы станут полезным ресурсом для новичков Clojure.
Я только начал изучать Clojure, частично мотивированный этот эссе. Я не профессиональный разработчик, но у меня есть несколько десятилетий опыта программирования (ARexx, VB/VBScript/VBA, а затем Perl и ежедневное использование R, начиная с 2011 года). Моя платформа - 64-битная Windows 7. Я использую Emacs 24.3, cider 20131221 и Leiningen 2.3.3 на Java 1.7.0_45 64-разрядном сервере Java Hotspot. Я купил Clojure Программирование и Clojure Анализ данных Cookbook и погрузился в оба. Я нашел их многообещающими, но я теряюсь в деталях.
Очевидно, что нужно сделать, чтобы застрять и экспериментировать с упражнениями кода и небольшими задачами, но непосредственной проблемой для меня была сложность структурирования, организации и даже простых запущенных проектов в Clojure. С R я могу уйти с файлом простого текста, содержащим основную часть кода, возможно, с одним или двумя другими, содержащими общие функции для больших проектов.
Clojure очень отличается и не имеет опыта работы на Java, я изо всех сил пытаюсь собрать эти штуки. Clojure В программировании есть целая глава по организации и строительству проектов, но она настолько всеобъемлющая, что, наоборот, мне трудно разоблачить информацию, имеющую отношение ко мне сейчас. Наверное, я искал что-то вроде этого ответа в Swank, но инструменты, похоже, с этого времени продвинулись. Так вот.
- Leiningen производит среди прочего файл
project.clj
, который содержит определение проекта и зависимости. Думаю, я понял. Могу ли я использовать этот файл для кода, не связанного с определением, нижеdefproject
, или лучше оставить его нетронутым и иметь сам код в разных файлахclj
? - Если ответ заключается в том, чтобы оставить только файл
project.clj
, как установить связь между этим и другими файлами? Просто ли все файлыclj
в папке проекта считаются частью проекта? - Как определить основной файл кода, "точку входа" проекта? Скажем, у меня есть
project.clj
иmain.clj
с некоторыми вспомогательными функциями вcommon.clj
- как определяются отношения между этими тремя файлами? Я могу вызывать функции изmain.clj
, но как проект знает, что основной является ядром проекта, если/когда я упаковываю проект в uberjar? - Если у меня есть несколько файлов
clj
, каков наилучший способ импорта функций? Я читал оrequire
иuse
(иimport
иrefer
и...), но я не совсем понимаю разницу, и эти два ключевых слова трудно найти. Примеры для REPL в Clojure книге анализа данных чаще всего выбираютuse
. Я нашел аналогичный вопрос, но это было немного над моей головой. - Это больше зависит от конкретного инструмента, но по мере того, как Emacs, по-видимому, широко используется, кажется справедливым спросить: какой хороший рабочий процесс запускать небольшие фрагменты кода, указанные (скажем), пример
main.clj
, приведенный выше? В настоящее время я просто открываю файлmain.clj
в Emacs, делаюM-x cider-jack-in
, чтобы установить REPL, эксперимент в REPL, а затем, когда я хочу попробовать что-то, я выбираю весь буфер и выбираюEval region
из меню CIDER (C-c C-R
). Является ли эта стандартная процедура работы или совершенно ошибочной? - Существует ли соглашение для определения пространств имен? Я думаю, я понимаю, что пространства имен могут охватывать несколько файлов
clj
и чтоns
используется для определения пространства имен. Должен ли я явным образом определять пространство имен (в начале) каждого файла кода? Clojure Программирование имеет некоторые рекомендации, но меня интересуют данные от других пользователей. - Clojure программирование говорит "Использовать символы подчеркивания в именах файлов, когда пространства имен содержат тире. Очень просто, если ваше пространство имен должно быть
com.my-project.foo
, исходный код для этого пространства имен должен находиться в файле, расположенном вcom/my_project/foo.clj
". (EDIT, как объяснено в этот полезный ответ, а также этот). Это ограничение никогда бы не произошло со мной. Существуют ли какие-либо другие ошибки в отношении имен пространств имен и переменных? R часто использует точки в именах переменных, но, я думаю, учитывая соединение с Java, в большинстве случаев следует избегать точек.