replikativ / datahike

A fast, immutable, distributed & compositional Datalog engine for everyone.
https://datahike.io
Eclipse Public License 1.0
1.62k stars 95 forks source link

[Bug]: can't import datahike.api at repl: Unable to resolve symbol: abs #626

Closed timgilbert closed 1 year ago

timgilbert commented 1 year ago

What version of Datahike are you using?

0.6.1540

What version of Java are you using?

openjdk 17.0.7 2023-04-18

What operating system are you using?

Windows 11, arch linux on WSL2

What database EDN configuration are you using?

n/a

Describe the bug

I'm using a project.clj that looks like this:

(defproject lein-datahike-repro "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.10.0"]
                 [io.replikativ/datahike "0.6.1540"]]
  :source-paths ["."]
  :repl-options {:init-ns lein-datahike-repro}
  :main lein-datahike-repro)

...and a file at the top level lein-datahike-repro.clj:

(ns lein-datahike-repro (:require [datahike.api :as d]))
(defn hello [] "world")

When I hit lein repl from this directory I get this error:

% lein repl
#error {
 :cause Unable to resolve symbol: abs in this context
 :via
 [{:type clojure.lang.Compiler$CompilerException
   :message Syntax error compiling at (datahike/query_stats.cljc:33:25).
   :data #:clojure.error{:phase :compile-syntax-check, :line 33, :column 25, :source datahike/query_stats.cljc}
   :at [clojure.lang.Compiler analyze Compiler.java 6808]}
  {:type java.lang.RuntimeException
   :message Unable to resolve symbol: abs in this context
   :at [clojure.lang.Util runtimeException Util.java 221]}]
 :trace
 [[clojure.lang.Util runtimeException Util.java 221]
  [clojure.lang.Compiler resolveIn Compiler.java 7413]
  [clojure.lang.Compiler resolve Compiler.java 7357]
  [clojure.lang.Compiler analyzeSymbol Compiler.java 7318]
  [clojure.lang.Compiler analyze Compiler.java 6768]
  [clojure.lang.Compiler analyze Compiler.java 6745]
  [clojure.lang.Compiler$InvokeExpr parse Compiler.java 3820]
  [clojure.lang.Compiler analyzeSeq Compiler.java 7108]
  [clojure.lang.Compiler analyze Compiler.java 6789]
  [clojure.lang.Compiler analyze Compiler.java 6745]
  [clojure.lang.Compiler$InvokeExpr parse Compiler.java 3888]
  [clojure.lang.Compiler analyzeSeq Compiler.java 7108]
  [clojure.lang.Compiler analyze Compiler.java 6789]
  [clojure.lang.Compiler analyze Compiler.java 6745]
  [clojure.lang.Compiler$InvokeExpr parse Compiler.java 3888]
  [clojure.lang.Compiler analyzeSeq Compiler.java 7108]
  [clojure.lang.Compiler analyze Compiler.java 6789]
  [clojure.lang.Compiler analyze Compiler.java 6745]
  [clojure.lang.Compiler$InvokeExpr parse Compiler.java 3888]
  [clojure.lang.Compiler analyzeSeq Compiler.java 7108]
  [clojure.lang.Compiler analyze Compiler.java 6789]
  [clojure.lang.Compiler analyze Compiler.java 6745]
  [clojure.lang.Compiler$BodyExpr$Parser parse Compiler.java 6120]
  [clojure.lang.Compiler$LetExpr$Parser parse Compiler.java 6436]
  [clojure.lang.Compiler analyzeSeq Compiler.java 7106]
  [clojure.lang.Compiler analyze Compiler.java 6789]
  [clojure.lang.Compiler analyzeSeq Compiler.java 7094]
  [clojure.lang.Compiler analyze Compiler.java 6789]
  [clojure.lang.Compiler analyze Compiler.java 6745]
  [clojure.lang.Compiler$BodyExpr$Parser parse Compiler.java 6120]
  [clojure.lang.Compiler$FnMethod parse Compiler.java 5467]
  [clojure.lang.Compiler$FnExpr parse Compiler.java 4029]
  [clojure.lang.Compiler analyzeSeq Compiler.java 7104]
  [clojure.lang.Compiler analyze Compiler.java 6789]
  [clojure.lang.Compiler analyzeSeq Compiler.java 7094]
  [clojure.lang.Compiler analyze Compiler.java 6789]
  [clojure.lang.Compiler access$300 Compiler.java 38]
  [clojure.lang.Compiler$DefExpr$Parser parse Compiler.java 596]
  [clojure.lang.Compiler analyzeSeq Compiler.java 7106]
  [clojure.lang.Compiler analyze Compiler.java 6789]
  [clojure.lang.Compiler analyze Compiler.java 6745]
  [clojure.lang.Compiler eval Compiler.java 7180]
  [clojure.lang.Compiler load Compiler.java 7635]
  [clojure.lang.RT loadResourceScript RT.java 381]
  [clojure.lang.RT loadResourceScript RT.java 372]
  [clojure.lang.RT load RT.java 463]
  [clojure.lang.RT load RT.java 428]
  [clojure.core$load$fn__6824 invoke core.clj 6126]
  [clojure.core$load invokeStatic core.clj 6125]
  [clojure.core$load doInvoke core.clj 6109]
  [clojure.lang.RestFn invoke RestFn.java 408]
  [clojure.core$load_one invokeStatic core.clj 5908]
  [clojure.core$load_one invoke core.clj 5903]
  [clojure.core$load_lib$fn__6765 invoke core.clj 5948]
  [clojure.core$load_lib invokeStatic core.clj 5947]
  [clojure.core$load_lib doInvoke core.clj 5928]
  [clojure.lang.RestFn applyTo RestFn.java 142]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$load_libs invokeStatic core.clj 5985]
  [clojure.core$load_libs doInvoke core.clj 5969]
  [clojure.lang.RestFn applyTo RestFn.java 137]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$require invokeStatic core.clj 6007]
  [clojure.core$require doInvoke core.clj 6007]
  [clojure.lang.RestFn invoke RestFn.java 3204]
  [datahike.query$eval32032$loading__6706__auto____32033 invoke query.cljc 1]
  [datahike.query$eval32032 invokeStatic query.cljc 1]
  [datahike.query$eval32032 invoke query.cljc 1]
  [clojure.lang.Compiler eval Compiler.java 7176]
  [clojure.lang.Compiler eval Compiler.java 7165]
  [clojure.lang.Compiler load Compiler.java 7635]
  [clojure.lang.RT loadResourceScript RT.java 381]
  [clojure.lang.RT loadResourceScript RT.java 372]
  [clojure.lang.RT load RT.java 463]
  [clojure.lang.RT load RT.java 428]
  [clojure.core$load$fn__6824 invoke core.clj 6126]
  [clojure.core$load invokeStatic core.clj 6125]
  [clojure.core$load doInvoke core.clj 6109]
  [clojure.lang.RestFn invoke RestFn.java 408]
  [clojure.core$load_one invokeStatic core.clj 5908]
  [clojure.core$load_one invoke core.clj 5903]
  [clojure.core$load_lib$fn__6765 invoke core.clj 5948]
  [clojure.core$load_lib invokeStatic core.clj 5947]
  [clojure.core$load_lib doInvoke core.clj 5928]
  [clojure.lang.RestFn applyTo RestFn.java 142]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$load_libs invokeStatic core.clj 5985]
  [clojure.core$load_libs doInvoke core.clj 5969]
  [clojure.lang.RestFn applyTo RestFn.java 137]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$require invokeStatic core.clj 6007]
  [clojure.core$require doInvoke core.clj 6007]
  [clojure.lang.RestFn invoke RestFn.java 703]
  [datahike.core$eval30784$loading__6706__auto____30785 invoke core.cljc 1]
  [datahike.core$eval30784 invokeStatic core.cljc 1]
  [datahike.core$eval30784 invoke core.cljc 1]
  [clojure.lang.Compiler eval Compiler.java 7176]
  [clojure.lang.Compiler eval Compiler.java 7165]
  [clojure.lang.Compiler load Compiler.java 7635]
  [clojure.lang.RT loadResourceScript RT.java 381]
  [clojure.lang.RT loadResourceScript RT.java 372]
  [clojure.lang.RT load RT.java 463]
  [clojure.lang.RT load RT.java 428]
  [clojure.core$load$fn__6824 invoke core.clj 6126]
  [clojure.core$load invokeStatic core.clj 6125]
  [clojure.core$load doInvoke core.clj 6109]
  [clojure.lang.RestFn invoke RestFn.java 408]
  [clojure.core$load_one invokeStatic core.clj 5908]
  [clojure.core$load_one invoke core.clj 5903]
  [clojure.core$load_lib$fn__6765 invoke core.clj 5948]
  [clojure.core$load_lib invokeStatic core.clj 5947]
  [clojure.core$load_lib doInvoke core.clj 5928]
  [clojure.lang.RestFn applyTo RestFn.java 142]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$load_libs invokeStatic core.clj 5985]
  [clojure.core$load_libs doInvoke core.clj 5969]
  [clojure.lang.RestFn applyTo RestFn.java 137]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$require invokeStatic core.clj 6007]
  [clojure.core$require doInvoke core.clj 6007]
  [clojure.lang.RestFn invoke RestFn.java 805]
  [datahike.writing$eval29428$loading__6706__auto____29429 invoke writing.cljc 1]
  [datahike.writing$eval29428 invokeStatic writing.cljc 1]
  [datahike.writing$eval29428 invoke writing.cljc 1]
  [clojure.lang.Compiler eval Compiler.java 7176]
  [clojure.lang.Compiler eval Compiler.java 7165]
  [clojure.lang.Compiler load Compiler.java 7635]
  [clojure.lang.RT loadResourceScript RT.java 381]
  [clojure.lang.RT loadResourceScript RT.java 372]
  [clojure.lang.RT load RT.java 463]
  [clojure.lang.RT load RT.java 428]
  [clojure.core$load$fn__6824 invoke core.clj 6126]
  [clojure.core$load invokeStatic core.clj 6125]
  [clojure.core$load doInvoke core.clj 6109]
  [clojure.lang.RestFn invoke RestFn.java 408]
  [clojure.core$load_one invokeStatic core.clj 5908]
  [clojure.core$load_one invoke core.clj 5903]
  [clojure.core$load_lib$fn__6765 invoke core.clj 5948]
  [clojure.core$load_lib invokeStatic core.clj 5947]
  [clojure.core$load_lib doInvoke core.clj 5928]
  [clojure.lang.RestFn applyTo RestFn.java 142]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$load_libs invokeStatic core.clj 5985]
  [clojure.core$load_libs doInvoke core.clj 5969]
  [clojure.lang.RestFn applyTo RestFn.java 137]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$require invokeStatic core.clj 6007]
  [clojure.core$require doInvoke core.clj 6007]
  [clojure.lang.RestFn invoke RestFn.java 703]
  [datahike.connector$eval163$loading__6706__auto____164 invoke connector.cljc 1]
  [datahike.connector$eval163 invokeStatic connector.cljc 1]
  [datahike.connector$eval163 invoke connector.cljc 1]
  [clojure.lang.Compiler eval Compiler.java 7176]
  [clojure.lang.Compiler eval Compiler.java 7165]
  [clojure.lang.Compiler load Compiler.java 7635]
  [clojure.lang.RT loadResourceScript RT.java 381]
  [clojure.lang.RT loadResourceScript RT.java 372]
  [clojure.lang.RT load RT.java 463]
  [clojure.lang.RT load RT.java 428]
  [clojure.core$load$fn__6824 invoke core.clj 6126]
  [clojure.core$load invokeStatic core.clj 6125]
  [clojure.core$load doInvoke core.clj 6109]
  [clojure.lang.RestFn invoke RestFn.java 408]
  [clojure.core$load_one invokeStatic core.clj 5908]
  [clojure.core$load_one invoke core.clj 5903]
  [clojure.core$load_lib$fn__6765 invoke core.clj 5948]
  [clojure.core$load_lib invokeStatic core.clj 5947]
  [clojure.core$load_lib doInvoke core.clj 5928]
  [clojure.lang.RestFn applyTo RestFn.java 142]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$load_libs invokeStatic core.clj 5985]
  [clojure.core$load_libs doInvoke core.clj 5969]
  [clojure.lang.RestFn applyTo RestFn.java 137]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$require invokeStatic core.clj 6007]
  [clojure.core$require doInvoke core.clj 6007]
  [clojure.lang.RestFn invoke RestFn.java 2422]
  [datahike.api$eval155$loading__6706__auto____156 invoke api.cljc 1]
  [datahike.api$eval155 invokeStatic api.cljc 1]
  [datahike.api$eval155 invoke api.cljc 1]
  [clojure.lang.Compiler eval Compiler.java 7176]
  [clojure.lang.Compiler eval Compiler.java 7165]
  [clojure.lang.Compiler load Compiler.java 7635]
  [clojure.lang.RT loadResourceScript RT.java 381]
  [clojure.lang.RT loadResourceScript RT.java 372]
  [clojure.lang.RT load RT.java 463]
  [clojure.lang.RT load RT.java 428]
  [clojure.core$load$fn__6824 invoke core.clj 6126]
  [clojure.core$load invokeStatic core.clj 6125]
  [clojure.core$load doInvoke core.clj 6109]
  [clojure.lang.RestFn invoke RestFn.java 408]
  [clojure.core$load_one invokeStatic core.clj 5908]
  [clojure.core$load_one invoke core.clj 5903]
  [clojure.core$load_lib$fn__6765 invoke core.clj 5948]
  [clojure.core$load_lib invokeStatic core.clj 5947]
  [clojure.core$load_lib doInvoke core.clj 5928]
  [clojure.lang.RestFn applyTo RestFn.java 142]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$load_libs invokeStatic core.clj 5985]
  [clojure.core$load_libs doInvoke core.clj 5969]
  [clojure.lang.RestFn applyTo RestFn.java 137]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$require invokeStatic core.clj 6007]
  [clojure.core$require doInvoke core.clj 6007]
  [clojure.lang.RestFn invoke RestFn.java 408]
  [lein_datahike_repro$eval149$loading__6706__auto____150 invoke lein_datahike_repro.clj 1]
  [lein_datahike_repro$eval149 invokeStatic lein_datahike_repro.clj 1]
  [lein_datahike_repro$eval149 invoke lein_datahike_repro.clj 1]
  [clojure.lang.Compiler eval Compiler.java 7176]
  [clojure.lang.Compiler eval Compiler.java 7165]
  [clojure.lang.Compiler load Compiler.java 7635]
  [clojure.lang.RT loadResourceScript RT.java 381]
  [clojure.lang.RT loadResourceScript RT.java 372]
  [clojure.lang.RT load RT.java 463]
  [clojure.lang.RT load RT.java 428]
  [clojure.core$load$fn__6824 invoke core.clj 6126]
  [clojure.core$load invokeStatic core.clj 6125]
  [clojure.core$load doInvoke core.clj 6109]
  [clojure.lang.RestFn invoke RestFn.java 408]
  [clojure.core$load_one invokeStatic core.clj 5908]
  [clojure.core$load_one invoke core.clj 5903]
  [clojure.core$load_lib$fn__6765 invoke core.clj 5948]
  [clojure.core$load_lib invokeStatic core.clj 5947]
  [clojure.core$load_lib doInvoke core.clj 5928]
  [clojure.lang.RestFn applyTo RestFn.java 142]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$load_libs invokeStatic core.clj 5985]
  [clojure.core$load_libs doInvoke core.clj 5969]
  [clojure.lang.RestFn applyTo RestFn.java 137]
  [clojure.core$apply invokeStatic core.clj 667]
  [clojure.core$require invokeStatic core.clj 6007]
  [clojure.core$require doInvoke core.clj 6007]
  [clojure.lang.RestFn invoke RestFn.java 408]
  [user$eval5 invokeStatic form-init3517037586458477172.clj 1]
  [user$eval5 invoke form-init3517037586458477172.clj 1]
  [clojure.lang.Compiler eval Compiler.java 7176]
  [clojure.lang.Compiler eval Compiler.java 7165]
  [clojure.lang.Compiler eval Compiler.java 7165]
  [clojure.lang.Compiler load Compiler.java 7635]
  [clojure.lang.Compiler loadFile Compiler.java 7573]
  [clojure.main$load_script invokeStatic main.clj 452]
  [clojure.main$init_opt invokeStatic main.clj 454]
  [clojure.main$init_opt invoke main.clj 454]
  [clojure.main$initialize invokeStatic main.clj 485]
  [clojure.main$null_opt invokeStatic main.clj 519]
  [clojure.main$null_opt invoke main.clj 516]
  [clojure.main$main invokeStatic main.clj 598]
  [clojure.main$main doInvoke main.clj 561]
  [clojure.lang.RestFn applyTo RestFn.java 137]
  [clojure.lang.Var applyTo Var.java 705]
  [clojure.main main main.java 37]]}
nREPL server started on port 35217 on host 127.0.0.1 - nrepl://127.0.0.1:35217
REPL-y 0.5.1, nREPL 1.0.0
Clojure 1.10.0
OpenJDK 64-Bit Server VM 17.0.7+7
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

lein-datahike-repro=>

I've tried this with lots of previous datahike releases from clojars (back to 0.5.1520) with the same error.

I doubt WSL is the culprit here as all my other Clojure development has been working fine, but the version there is:

WSL version: 1.2.5.0
Kernel version: 5.15.90.1
WSLg version: 1.0.51
MSRDC version: 1.2.3770
Direct3D version: 1.608.2-61064218
DXCore version: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows version: 10.0.22621.1635

What is the expected behaviour?

No tracebacks please

How can the behaviour be reproduced?

See description

timgilbert commented 1 year ago

Aha. This seems to be related to the Clojure version. I'm running 1.10, but (abs) wasn't added until 1.11. (I can see the correct dependency in the deps.edn, not certain why lain was ignoring it, but maybe it's a bug in lein.)

jsmassa commented 1 year ago

Hi @timgilbert, thanks for reporting this issue :)

We have encountered the same problem ourselves and we are already planning to ensure backward-compatibility in the future as in general we cannot always be sure that every user will be using the most recent clojure version.

Sorry that you ran into this problem.

timgilbert commented 1 year ago

Thanks! I guess this issue can be closed in favor of #619 then.