15

I type the following at the Clojurescript namespace.

cljs.user> (use '[clojure.zip :only [insert-child]])

WARNING: Use of undeclared Var cljs.user/use at line 1 
"Error evaluating:" (use (quote [clojure.zip :only [insert-child]])) :as "cljs.user.use.call(null,cljs.core.vec([\"\\uFDD1'clojure.zip\",\"\\uFDD0'only\",cljs.core.vec([\"\\uFDD1'insert-child\"])]));\n"
#<TypeError: Cannot call method 'call' of undefined>
TypeError: Cannot call method 'call' of undefined
    at eval (eval at <anonymous> (http://localhost:3000/main.js:32728:147), <anonymous>:1:85)
    at eval (eval at <anonymous> (http://localhost:3000/main.js:32728:147), <anonymous>:6:3)
    at http://localhost:3000/main.js:32728:142
    at evaluate_javascript (http://localhost:3000/main.js:32741:4)
    at Object.callback (http://localhost:3000/main.js:32806:138)
    at goog.messaging.AbstractChannel.deliver (http://localhost:3000/main.js:31059:13)
    at goog.net.xpc.CrossPageChannel.deliver_ (http://localhost:3000/main.js:32164:14)
    at Function.goog.net.xpc.NativeMessagingTransport.messageReceived_ (http://localhost:3000/main.js:31732:13)
    at goog.events.Listener.handleEvent (http://localhost:3000/main.js:22590:26)
    at Object.goog.events.fireListener (http://localhost:3000/main.js:22924:21)
nil

It seems to be stating that the 'use' method does not exist in the cljs.user namespace. This kind of makes sense to me, as Clojurescript itself cannot evaluate Clojure expressions. However, I know that Clojurescript has a clojure.zip namespace, I have used clojure.zip in the namespace declaration as (:use [clojure.zip :only [insert-child]]).

How do I use the Clojurescript version of clojure.zip in the Clojurescript repl?

Stephen Cagle
  • 14,124
  • 16
  • 55
  • 86

1 Answers1

26

Because ClojureScript namespaces are implemented completely differently than Clojure, ClojureScript does not support the use or require forms directly.

Instead, you must use the ns macro. To use clojure.zip in the cljs.user namespace, then, just do the following:

(ns cljs.user (:use [clojure.zip :only [insert-child]]))

Note that the forms supported in the ClojureScript version of ns are a subset of those supported in Clojure; specifically, :use clauses must specify an :only form, and the :require clause must specify an :as form.

levand
  • 8,440
  • 3
  • 41
  • 54
  • 1
    just a heads up, I just ran up against this same problem in 2016 still, trying to `(require ...)` some debug tools in the middle of my code – Josh.F Dec 22 '16 at 15:13