Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Clojure require namespace: "Don't know how to create ISeq from: clojure.lang.Keyword"

Tags:

clojure

I'm trying to split code in 2 files, each with it's own namespace. Following this tutorial.

But I get this error: Exception in thread "main" java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Keyword

I think it's because the namespace being included is not recognised properly.

Main file:

(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))))

Second file:

(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"]))

(note I copied the functions from mytest2.views in mytest2.handler for testing. They're not supposed to be in mytest2.handler).

Paths of files:

/mytest2/src/mytest2/handler.clj

/mytest2/src/mytest2/views.clj

(where first mytest2 is the name of the project, and the second is part of the path- automatically created by lein).

As you see in the first file I printed the class path to verify that /mytest2/src/mytest2/ is included, and yes it is.

like image 790
User Avatar asked Mar 29 '14 13:03

User


2 Answers

Received the same error from trying to use :refer :all in Clojurescript, which apparently is against the rules.

like image 108
ahhhhhhhhhhhhhhhhhhhhhhhhhhhhh Avatar answered Nov 15 '22 18:11

ahhhhhhhhhhhhhhhhhhhhhhhhhhhhh


You missed some brackets in your original code

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

There is just one pair of brackets missing. Do it as in your Main file:

;; Done right!
(ns mytest2.views
  (:require [hiccup.core :refer [html]]))

I am not familar with Compojure so I do not know what you have to require. But you need to add the bracket around :require.

like image 31
n2o Avatar answered Nov 15 '22 17:11

n2o