简体   繁体   中英

Clojurescript clojure.set not working

I've referenced ClojureScript clojure.set? and can only get the docstring to come up, but actually running any of the clojure.set function doesn't work. Using ClojureScript 0.0-3126 on Opera 28.0 and/or Chrome 41.0.2272.101 m on Windows 7 x64.

Any ideas on how to correct this? thanks

ClojureScript:cljs.user> (require '[clojure.set])
nil
ClojureScript:cljs.user> (doc clojure.set/union)
-------------------------
clojure.set/union
([] [s1] [s1 s2] [s1 s2 & sets])
  Return a set that is the union of the input sets
nil
ClojureScript:cljs.user> (clojure.set/union #{:a} #{:b})
TypeError: Cannot read property 'union' of undefined
TypeError: Cannot read property 'union' of undefined
    at eval (eval at <anonymous> (http://localhost:8888/js/coreweb.js:45250:260), <anonymous>:1:100)
    at eval (eval at <anonymous> (http://localhost:8888/js/coreweb.js:45250:260), <anonymous>:9:3)
    at eval (ev al at <anonymous> (http://localhost:8888/js/coreweb.js:45250:260), <anonymous>:14:4)
    at http://localhost:8888/js/coreweb.js:45250:255
    at clojure$browser$repl$evaluate_javascript (http://localhost:8888/js/coreweb.js:45256:4)
    at Object.callback (http://localhost:8888/js/coreweb.js:45421:181)
    at goog.messaging.AbstractChannel.deliver (http://localhost:8888/js/coreweb.js:42499:13)
    at goog.net.xpc.CrossPageChannel.xpcDeliver (http://localhost:8888/js/coreweb.js:43463:14)
    at Function.goog.net.xpc.NativeMessagingTransport.messageReceived_ (http://localhost:8888/js/coreweb.js:42859:13)
    at Object.goog.events.fireListener (http://localhost:8888/js/coreweb.js:39835:21)

That's more personal research than an answer. Still, I did reproduce your problem in Chrome (on MAC) taking the ClojureScript Quick Start .

If the cljs server repl file is as follow (ie there is no require on clojure.set ):

(ns hello-world.core
  (:require [clojure.browser.repl :as repl]))

(defonce conn
   (repl/connect "http://localhost:9000/repl"))

(enable-console-print!)
(println "Hello world!")

and the repl.clj is:

(require 'cljs.repl)
(require 'cljs.closure)
(require 'cljs.repl.browser)

(cljs.closure/build "src"
                    {:main 'hello-world.core
                     :output-to "out/main.js"
                     :verbose true})

(cljs.repl/repl (cljs.repl.browser/repl-env)
                :watch "src"
                :output-dir "out")

Then starting the repl in a terminal with:

rlwrap java -cp cljs.jar:src clojure.main repl.clj

And connecting the browser on http://localhost:9000 , then this works:

ClojureScript:cljs.user> (require '[clojure.set])
nil
ClojureScript:cljs.user> (clojure.set/union #{6} #{9} #{7})
#{7 6 9}

Now, if you reload the server page http://localhost:9000 , and try again, I had the problem (doc is available on the symbol , but the var is not there anymore):

ClojureScript:cljs.user> (doc clojure.set/union)
-------------------------
clojure.set/union
([] [s1] [s1 s2] [s1 s2 & sets])
  Return a set that is the union of the input sets
nil
ClojureScript:cljs.user> (clojure.set/union #{6} #{9} #{7})
TypeError: Cannot read property 'union' of undefined
TypeError: Cannot read property 'union' of undefined
    at eval (eval at <anonymous> (http://localhost:9000/out/clojure/browser/repl.js:42:272), <anonymous>:1:100)

If you modify the cljs server file to require clojure.set , ie

(ns hello-world.core
      (:require [clojure.browser.repl :as repl]
                [clojure.set]))

Then, it looks like you still need to require clojure.set from the repl in order to use its functions, but then, you can reload the server page and it still works in the repl.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM