Suppose you have a lib that causes some errors during loading, like the following:
`
(ns broken-lib)
(} ; this line will cause a reader error
`
And then, if you {{require}} the lib, it would be added into {{loaded-libs}} in spite of the reader error, which makes {{require}} succeed silently after that.
user=> (contains? (loaded-libs) 'broken-lib)
false
user=> (require 'broken-lib)
CompilerException java.lang.RuntimeException: Unmatched delimiter: }, compiling:(broken_lib.clj:3:3)
user=> (contains? (loaded-libs) 'broken-lib)
true
user=> (require 'broken-lib)
nil
user=>
Things get worse if you have another namespace that requires a broken lib (say here {{broken-lib.core}}):
(ns broken-lib.core
(:require [broken-lib :as lib]))
Although you'll get the actual error the first time you load the depending namespace, after that you'll find a wrong compiler exception thrown every time you try to reload it. The situation will last even after you actually do fix the code causing the original error.
`
user=> (require 'broken-lib.core)
CompilerException java.lang.RuntimeException: Unmatched delimiter: }, compiling:(broken_lib.clj:3:3)
user=> (require 'broken-lib.core :reload)
CompilerException java.lang.Exception: namespace 'broken-lib' not found, compiling:(broken_lib/core.clj:1:1)
user=> (require 'broken-lib.core :reload) ;; reload after fix the bug in broken-lib
CompilerException java.lang.Exception: namespace 'broken-lib' not found, compiling:(broken_lib/core.clj:1:1)
user=>
`
Cause:
The patch for CLJ-1116 made the {{ns}} macro blindly add the lib being defined into {{loaded-libs}} even if an error occurs during loading.
Approach:
Modify {{clojure.core/load-lib}} so that it removes the lib from {{loaded-libs}} on error.