Daniel Compton

The personal blog of Daniel Compton - Projects

Conditional read not allowed - Clojure Reader Conditionals

A new feature in the upcoming Clojure 1.7 release is Reader Conditionals. Reader Conditionals let you write portable Clojure/ClojureScript code in the same file, and wrap platform specific code in an expression which will only be executed on the platform it’s meant for.

A simple example is

(try
 (>! c msg)
 (catch #?(:clj Exception
           :cljs js/Object)
        e)
 .... ))

One important restriction on Reader Conditionals is that they can only be used in Clojure files with a new .cljc extension.

I was recently porting some code to use Reader Conditionals and got this error message when compiling the namespace with a Reader Conditional in the file:

CompilerException java.lang.RuntimeException: Conditional read not allowed, compiling: <filename.clj>

I was very puzzled by this. After thinking for a little bit I started deleting parts of the file, to see if there was something in it which was stopping Reader Conditional use. I got down to a bare namespace with just a single reader conditional in the whole file and it still wouldn’t compile. I looked at my project.clj file to see if there was a weird setting in there causing problems but that looked fine too.

Eventually I realised that this file didn’t have a .cljc extension. I’d converted some of the files when I started, but then started adding Reader Conditionals to one I hadn’t converted. After changing the extension from .clj to .cljc everything compiled fine and I was on my way again.

I opened CLJ-1734 to give more descriptive error messages for Reader Conditional failures. Feel free to vote for it if you think it would be a helpful feature.