CLOJURESCRIPT HAS BEEN something I’ve been following on the sidelines for quite a while now. Poking a bit around with React at work, let my interest towards Om.Next. Contemplating on creating my own web-app, I wanted to give this lispy thing a go. The Om.Next documentation led me to the ClojureScript quick-start guide.
Tutorial: Create structure and file
mkdir -p src/hello_world;touch src/hello_world/core.cljs
Me copy-pasta
mkdir -p src/hello_world;touch src/hello_world/core.cljs
Tutorial: edit the src/hello_world/core.cljs to look like the following:
(ns hello-world.core) (enable-console-print!) (println "Hello world!")
Me copy-pasta
ns hello-world.core) (enable-console-print!) (println "Hello world!")
Tutorial: Add the following Clojure code to build.clj
(require 'cljs.build.api) (cljs.build.api/build "src" {:output-to "out/main.js"})
Me copy-pasta
(require 'cljs.build.api) (cljs.build.api/build "src" {:output-to "out/main.js"})
Tutorial: build it
java -cp cljs.jar:src clojure.main build.clj
Me copy-pasta
java -cp cljs.jar:src clojure.main build.clj
Tutorial: Create a file index.html
Me copy-pasta
Tutorial: open in browser and see error:
Uncaught ReferenceError: goog is not defined
Me
Check
Tutorial: modify index.html
Me copy-pasta
Tutorial: Refresh your index.html and you should finally see “Hello world!”
Me
base.js:677 goog.require could not find: hello_world.core goog.logToConsole_ @ base.js:677 goog.require @ base.js:709 (anonymous) @ index.html:6 base.js:711 Uncaught Error: goog.require could not find: hello_world.core at Object.goog.require (base.js:711) at index.html:6 goog.require @ base.js:711 (anonymous) @ index.html:6
Wut???
Being a first attempter hello-world implementer surely doesn’t make one familiar with the error messages of a new compiler. So I was somewhat perplexed on what was wrong, what to do, how to debug and generally where to look
Did a list of files, although I had no idea what to look for
hello-world» find
.
./build.clj
./out
./out/main.js
./out/goog
./out/goog/math
./out/goog/math/integer.js
./out/goog/math/long.js
./out/goog/debug
./out/goog/debug/error.js
./out/goog/reflect
./out/goog/reflect/reflect.js
./out/goog/dom
./out/goog/dom/nodetype.js
./out/goog/deps.js
./out/goog/asserts
./out/goog/asserts/asserts.js
./out/goog/base.js
./out/goog/string
./out/goog/string/stringbuffer.js
./out/goog/string/string.js
./out/goog/array
./out/goog/array/array.js
./out/goog/object
./out/goog/object/object.js
./out/cljs
./out/cljs/core.cljs
./out/cljs/core.js.map
./out/cljs/core.js
./out/process
./out/process/env.js
./out/process/env.js.map
./out/process/env.cljs
./out/process/env.cljs.cache.json
./cljs.jar
./index.html
./src
./src/hello_world
./src/hello_world/core.cljs
Look okay I guess. If anything, only the file I’ve could have messed up would besrc/hello_world/core.cljs
, but it seemed correct. I then began cat’ing files and found abvious nothing wrong. A bit frustrated, I followed the next steps in the tutorial which refactored some of the build and dependency stuff. The same error however still appeared.
For reasons unbeknownst to my self, I then opened the file in VSCode – the colorcoding immediately revealed something was wrong. The top line of the clojurescript file was not colored like the others
ns hello-world.core)
(enable-console-print!)
(println "Hello world!")
Great Scott! I’ve made a copy-pasta error and missed a begin-parens :-O
Wrong
ns hello-world.core)
Right
(ns hello-world.core)
Here I was cursing and swearing at the quick-guide. I was definit sure that I’d done it right, but alas a syntax violation was committed
I do wonder though, why the compiler did not error out on this!??