Ответ 1
Вы использовали только slurp из ядра clojure, что означает, что любая другая основная функция теперь недоступна для вас:) Попробуйте изменить ns
, чтобы использовать :require
вместо :use
, поскольку это более идиоматично.
Следует отметить, что порядок имеет значение в clojure, поэтому, если вы не объявляете функцию в верхней части вашего файла, как на C и некоторых других языках, более ранние функции не смогут сделать ссылки на них. Это то, что вызывало вашу ошибку раньше, и именно поэтому мне нравится определять мою функцию -main
внизу. Это вопрос стиля.
Другое дело, что ваша функция -main
принимает переменные args прямо сейчас и не использует их. В clojure идиоматично использовать _
для обозначения параметра, который не используется. Вы можете использовать & _
, чтобы избежать сообщений об ошибках, когда пользователь переходит в ненужные аргументы, но с самого начала я бы просто беззаботно выполнял функцию -main. Это связано с тем, что при запуске программы ничего не требуется, а ошибки облегчают отладку. Хорошо знать, что привыкает и где. Файл sample.csv
уже предоставлен и имеет на нем read-file
, поэтому программа должна запускаться, если ваша функция read-file
верна, а файл sample.csv
находится в правильном месте.
Что касается вашей функции -main
, было бы неплохо провести там небольшой тест, чтобы убедиться, что она выполняется правильно при ее запуске, поэтому я изменил ее, чтобы распечатать содержимое файла csv на консоли. Этот способ печати из файла эффективен и стоит изучать самостоятельно.
Наконец, убедитесь, что вы включили clojure-csv.core
в свой project.clj
файл.
core.clj:
(ns fileops.core
(:require
[clojure-csv.core :refer [parse-csv]]))
(defn read-file
"open and read the csv file"
[fname]
(with-open [file (clojure.java.io/reader fname)]
(parse-csv (slurp fname))))
(defn -main []
(println (clojure.string/join "\n" (read-file "resources/test.csv"))))
project.clj:
...
:dependencies [[org.clojure/clojure "1.5.1"]
[clojure-csv/clojure-csv "2.0.1"]
...]
:main fileops.core
Вам нужно объявить fileops.core как: main, как показано выше. Это говорит Leiningen, какую функцию выполнять при вводе lein run
. Очень важные и хитрые вещи.
Итак, теперь убедитесь, что вы находитесь в корневой директории вашего проекта и на терминале, запустите следующее:
lein clean
lein deps
lein run
Удачи!
Дальнейшее чтение: