我试图将代码分成2个文件,每个文件都有自己的 namespace 。在此tutorial之后。

但是我得到这个错误:
线程“主”中的异常java.lang.IllegalArgumentException:不知道如何通过以下方法创建ISeq:clojure.lang.Keyword

我认为这是因为无法正确识别包含的 namespace 。

主文件:

(ns mytest2.handler
  (:use compojure.core)
  (:require [compojure.handler :as handler]
            [compojure.route :as route]
            [mytest2.views :as foo] ;<-- line causing error
            [hiccup.core :refer (html)])
  )



(defn layout [title & content]
  (html
   [:head [:title title]]
   [:body content]))

(defn main-page []
  (layout "My Blog"
   [:h1 "My Blog"]
   [:p "Welcome to my page"]))

(defroutes app-routes
  (GET "/" [] (main-page))
  (route/resources "/")
  (route/not-found "Not Found"))

(def app
  (handler/site app-routes))

;    (println (seq (.getURLs (java.lang.ClassLoader/getSystemClassLoader))))

第二档:
(ns mytest2.views
  :require [hiccup.core :refer (html)]
  )

(defn layout [title & content]
  (html
   [:head [:title title]]
   [:body content]))

(defn main-page []
  (layout "My Blog"
   [:h1 "My Blog"]
   [:p "Welcome to my page"]))

(请注意,我从mytest2.handler中的mytest2.views复制了函数进行测试。它们不应该在mytest2.handler中)。

文件路径:

/mytest2/src/mytest2/handler.clj

/mytest2/src/mytest2/views.clj

(第一个mytest2是项目的名称,第二个是lein自动创建的路径的一部分)。

如您在第一个文件中看到的,我打印了类路径以验证是否包含/mytest2/src/mytest2/,是的。

最佳答案

您错过了原始代码中的一些方括号

;; wrong
(ns mytest2.views
  :require [hiccup.core :refer [html]])

仅缺少一对括号。像在您的主文件中那样进行操作:
;; Done right!
(ns mytest2.views
  (:require [hiccup.core :refer [html]]))

我不熟悉Compojure,所以不知道您需要什么。但是,您需要在:require周围添加括号。

关于clojure - Clojure需要命名空间: “Don' t know how to create ISeq from: clojure. lang.Keyword”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22731525/

10-11 18:11