https://github.com/xiongtx/reload-error-boot
Minimal repo for clojure-emacs/cider#2104.
https://github.com/xiongtx/reload-error-boot
boot cider clojure clojurescript
Last synced: 3 months ago
JSON representation
Minimal repo for clojure-emacs/cider#2104.
- Host: GitHub
- URL: https://github.com/xiongtx/reload-error-boot
- Owner: xiongtx
- License: epl-1.0
- Created: 2017-11-02T20:47:58.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2017-12-20T23:39:04.000Z (over 7 years ago)
- Last Synced: 2025-03-06T01:55:22.526Z (3 months ago)
- Topics: boot, cider, clojure, clojurescript
- Language: Clojure
- Size: 8.79 KB
- Stars: 0
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# reload-error-boot
Minimal repo for clojure-emacs/cider#2104.
This shows a problem with reloading the `clojure.test.check.generators` namespace without reloading the `clojure.spec.gen.alpha` namespace.
Since `clojure.spec.gen.alpha` [doesn't `:require`](https://github.com/clojure/spec.alpha/blob/spec.alpha-0.1.143/src/main/clojure/clojure/spec/gen/alpha.clj#L9-L11) `clojure.test.check.generators`, but rather dynamically loads some of its vars, the reload dependency tracking doesn't work properly.
## Usage
1. `cider-jack-in`
2. Go to `core.cljc` and `cider-eval-buffer`, `cider-refresh`, etc.
- See that generators for `clojure.spec.gen.alpha` and `clojure.test.check.generators` have the same classloaders:```
clojure.spec.alpha generator's classloader: #object[clojure.lang.DynamicClassLoader 0x73867ca9 clojure.lang.DynamicClassLoader@73867ca9]
clojure.test.check.generators generator's classloader: #object[clojure.lang.DynamicClassLoader 0x73867ca9 clojure.lang.DynamicClassLoader@73867ca9]
```3. In the REPL, compile ClojureScript with `(boot (cljs))`
4. `C-u cider-refresh` (`refresh-all`), then `cider-eval-buffer` again
- See that the generators now have different classloaders:```
clojure.spec.alpha generator's classloader: #object[clojure.lang.DynamicClassLoader 0x73867ca9 clojure.lang.DynamicClassLoader@73867ca9]
clojure.test.check.generators generator's classloader: #object[clojure.lang.DynamicClassLoader 0x170397bd clojure.lang.DynamicClassLoader@170397bd]
```In particular, that of `clojure.test.check.generators` has changed, while that of `clojure.spec.gen.alpha` ha remained the same. This is because `clojure.test.check.generators` was reloaded by the `cider-refresh`, thereby redefining the `Generator` record, but `clojure.spec.gen.alpha` was not.
For more on records and classloaders, see [Chris Houser's StackOverflow explanation](https://stackoverflow.com/a/7473707/864684).
5. Go to `clojure/spec/gen/alpha.clj` and eval the `lazy-combinators` form```clojure
(lazy-combinators hash-map list map not-empty set vector vector-distinct fmap elements
bind choose fmap one-of such-that tuple sample return
large-integer* double* frequency)
```
6. `cider-eval-buffer` and see that `clojure.spec.gen.alpha`'s generator now uses the `clojure.test.check.generators`'s classloader again:```
clojure.spec.alpha generator's classloader: #object[clojure.lang.DynamicClassLoader 0x170397bd clojure.lang.DynamicClassLoader@170397bd]
clojure.test.check.generators generator's classloader: #object[clojure.lang.DynamicClassLoader 0x170397bd clojure.lang.DynamicClassLoader@170397bd]
```## License
Copyright © 2017 Tianxiang Xiong
Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.