1

I am learning Clojure - it's a lot of fun! I am trying to use Incanter and Clojure Soup in the same file:

(require '[jsoup.soup :as soup])
(use '(incanter core stats io charts datasets))

And I get the following error:

CompilerException java.lang.IllegalStateException: $ already refers to: #'jsoup.soup/$ in namespace: user, compiling

I think I understand why, but how can I solve this problem? Appreciate this website and all the gurus on it!

Thanks.

Cactus
  • 27,075
  • 9
  • 69
  • 149

1 Answers1

3

If you only actually use one of the $ functions then you can exclude the other one

(ns myproject.example
   (:require [jsoup.soup :as soup]
             [incanter [core :refer :all :exclude [$]]
                       [stats :refer :all] 
                       [io :refer :all] 
                       [charts :refer :all] 
                       [datasets :refer :all]]))

or you can take the approach of explicitly naming the vars you want to refer to in your namespace and explicitly calling the others by namespace-alias/function, which would look more like this:

(ns myproject.example
   (:require [jsoup.soup :as soup]
             [incanter [core :refer [$ ... and others here ...] 
                             :as incanter]
                       [stats :as stats] 
                       [io :as io] 
                       [charts :as charts] 
                       [datasets :as dataset]]))

The use method of using other namespaces is discouraged in modern clojure code and has been subsumed by the refer form, so I use that form in these examples. It's also strongly encouraged to put the refer forms in the namespace declaration.

Arthur Ulfeldt
  • 90,827
  • 27
  • 201
  • 284