babashka / sci

Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
Eclipse Public License 1.0
1.21k stars 85 forks source link

When defining var twice but from other file, metadata isn't changed #891

Closed borkdude closed 1 year ago

borkdude commented 1 year ago

Repro:

user=> (require '[sci.core :as sci])
nil
user=> (sci/binding [sci/file "duuude"])
nil
user=> (def ctx (sci/init {}))
#'user/ctx
user=> (sci/binding [sci/file "duuude"] (sci/eval-string* ctx "(ns dude) (defn foo [])"))
#'dude/foo
user=> (meta (sci/eval-string* ctx "#'dude/foo"))
{:name foo, :ns #object[sci.lang.Namespace 0x1c80f8dd "dude"], :file "duuude", :arglists ([]), :line 1, :column 11}
user=> (sci/binding [sci/file "duuude2"] (sci/eval-string* ctx "(ns dude) (defn foo [])"))
#'dude/foo
user=> (meta (sci/eval-string* ctx "#'dude/foo"))
{:name foo, :ns #object[sci.lang.Namespace 0x1c80f8dd "dude"], :file "duuude", :arglists ([]), :line 1, :column 11}

;; in JVM Clojure:
user=> (alter-var-root #'*file* (constantly "duuude1"))
"duuude1"
user=> (defn foobar [])
#'user/foobar
user=> (:file (meta #'foobar))
"duuude1"
user=> (alter-var-root #'*file* (constantly "duuude2"))
"duuude2"
user=> (defn foobar [])
#'user/foobar
user=> (:file (meta #'foobar))
"duuude2"

See https://github.com/babashka/babashka.nrepl/issues/63