Как правильно привязать Vars к нескольким файлам - PullRequest
2 голосов
/ 20 марта 2010

Я только изучаю Clojure, и у меня возникают проблемы с переносом кода в разные файлы.

Я продолжаю выводить эту ошибку из appnrunner.clj -

Exception in thread "main" java.lang.Exception: Unable to resolve symbol: -run-application in this context

Кажется, что он находит пространства имен в порядке, но затем не видит Vars как связанного ... Есть идеи как это исправить?

Вот мой код:

ЗАЯВКА НА ПРИЛОЖЕНИЕ -

(ns src/apprunner
  (:use src/functions))

(def input-files [(resource-path "a.txt") (resource-path "b.txt") (resource-path "c.txt")])
(def output-file (resource-path "output.txt"))

(defn run-application []
  (sort-files input-files output-file))

(run-application)

ФУНКЦИИ ПРИМЕНЕНИЯ -

(ns src/functions
  (:use clojure.contrib.duck-streams))

(defn flatten [x]
  (let [s? #(instance? clojure.lang.Sequential %)]
    (filter
      (complement s?)
      (tree-seq s? seq x))))

(defn resource-path [file]
  (str "C:/Users/Alex and Paula/Documents/SoftwareProjects/MyClojureApp/resources/" file))

(defn split2 [str delim]
  (seq (.split str delim)))

(defstruct person :first-name :last-name)

(defn read-file-content [file]
  (apply str
    (interpose "\n" (read-lines file))))

(defn person-from-line [line]
  (let [sections (split2 line " ")]
    (struct person (first sections) (second sections))))

(defn formatted-for-display [person]
  (str (:first-name person) (.toUpperCase " ") (:last-name person)))

(defn sort-by-keys [struct-map keys]
  (sort-by #(vec (map % [keys])) struct-map))

(defn formatted-output [persons output-number]
  (let [heading (str "Output #" output-number "\n")
        sorted-persons-for-output (apply str (interpose "\n" (map formatted-for-display (sort-by-keys persons (:first-name :last-name)))))]
    (str heading sorted-persons-for-output)))

(defn read-persons-from [file]
  (let [lines (read-lines file)]
    (map person-from-line lines)))

(defn write-persons-to [file persons]
  (dotimes [i 3]
    (append-spit file (formatted-output persons (+ 1 i)))))

(defn sort-files [input-files output-file]
  (let [persons (flatten (map read-persons-from input-files))]
    (write-persons-to output-file persons)))

1 Ответ

4 голосов
/ 20 марта 2010

Вы не правильно называете свои пространства имен!

Вы должны сделать что-то вроде этого:


;;; in file src/apprunner/core.clj
;;; (namespace names should contain at least one dot for things
;;; not to go into the default package... or some such thing)
(ns apprunner.core
  (:use apprunner.functions)

;;; the rest of your code for this file follows unchanged

;;; in file src/apprunner/functions.clj
(ns apprunner.functions
  (:use clojure.contrib.duck-streams))

;;; the rest of your code for this file follows unchanged

Выполнение вышеуказанного в REPL ((use 'apprunner.core) и т. Д.) У меня нормально работает.

Чтобы подвести итог, в чем заключалась проблема: имена пространств имен должны содержать точки, где пути к файлам, определяющим их, содержат косую черту / обратную косую черту (я не имею в виду относительные пути - относительно некоторого каталога, который на самом деле находится на Путь к классам). Кроме того, каталог src/ - это каталог, который вы помещаете в путь к классам, поэтому вы не включаете часть src. в имена вашего пространства имен. Смотрите, например пример src/foo/bar/baz.clj против foo.bar.baz в моем ответе на ваш предыдущий вопрос .

Да, и, кстати, выяснить путь к классу сложно, точка. Поэтому будьте уверены, что вас не обескураживают подобные проблемы! :-) Возможно, вы захотите включить информацию о том, как вы выполняете свой код, если у вас есть больше вопросов, касающихся пространства имен или пути к классам, или если вышеприведенное не решит проблему для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...