【问题标题】:Clojurescript repl trying to invoke Clojure function from the Transit libraryClojurescript repl 尝试从 Transit 库调用 Clojure 函数
【发布时间】:2020-09-23 20:51:05
【问题描述】:

我同时拥有 cognitect.transit-cljcognitect.transit-cljs 依赖项,因为我的项目是后端的 Clojure 和前端的 CLJS。我正在使用cider-connect 连接到苹果酒中的 shadow-cljs repl。

在repl中,我这样做:

(require '[cognitect.transit :as xit])
(def my-writer (xit/writer :json))

我收到此错误:

Execution error (ArityException) at nrepl.middleware.interruptible-eval/evaluate$fn (interruptible_eval.clj:91).
Wrong number of args (1) passed to: cognitect.transit/writer

它似乎正在尝试调用transmit/writer 的java 版本。我的依赖项或设置有问题吗?

这是完整的堆栈跟踪:

clojure.lang.Compiler$CompilerException: Syntax error macroexpanding at (NO_SOURCE_FILE:45:29).
#:clojure.error{:phase :execution, :line 45, :column 29, :source "NO_SOURCE_FILE"}
 at clojure.lang.Compiler$InvokeExpr.eval (Compiler.java:3707)
    clojure.lang.Compiler$DefExpr.eval (Compiler.java:457)
    clojure.lang.Compiler.eval (Compiler.java:7182)
    clojure.lang.Compiler.eval (Compiler.java:7132)
    clojure.core$eval.invokeStatic (core.clj:3214)
    clojure.core$eval.invoke (core.clj:3210)
    nrepl.middleware.interruptible_eval$evaluate$fn__42793.invoke (interruptible_eval.clj:91)
    clojure.main$repl$read_eval_print__9086$fn__9089.invoke (main.clj:437)
    clojure.main$repl$read_eval_print__9086.invoke (main.clj:437)
    clojure.main$repl$fn__9095.invoke (main.clj:458)
    clojure.main$repl.invokeStatic (main.clj:458)
    clojure.main$repl.doInvoke (main.clj:368)
    clojure.lang.RestFn.invoke (RestFn.java:1523)
    nrepl.middleware.interruptible_eval$evaluate.invokeStatic (interruptible_eval.clj:84)
    nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:56)
    nrepl.middleware.interruptible_eval$interruptible_eval$fn__42819$fn__42823.invoke (interruptible_eval.clj:155)
    clojure.lang.AFn.run (AFn.java:22)
    nrepl.middleware.session$session_exec$main_loop__43068$fn__43072.invoke (session.clj:190)
    nrepl.middleware.session$session_exec$main_loop__43068.invoke (session.clj:189)
    clojure.lang.AFn.run (AFn.java:22)
    java.lang.Thread.run (Thread.java:748)
Caused by: clojure.lang.ArityException: Wrong number of args (1) passed to: cognitect.transit/writer
 at clojure.lang.AFn.throwArity (AFn.java:429)
    clojure.lang.AFn.invoke (AFn.java:32)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.lang.Compiler$InvokeExpr.eval (Compiler.java:3702)
    clojure.lang.Compiler$DefExpr.eval (Compiler.java:457)
    clojure.lang.Compiler.eval (Compiler.java:7182)
    clojure.lang.Compiler.eval (Compiler.java:7132)
    clojure.core$eval.invokeStatic (core.clj:3214)
    clojure.core$eval.invoke (core.clj:3210)
    nrepl.middleware.interruptible_eval$evaluate$fn__42793.invoke (interruptible_eval.clj:91)
    clojure.main$repl$read_eval_print__9086$fn__9089.invoke (main.clj:437)
    clojure.main$repl$read_eval_print__9086.invoke (main.clj:437)
    clojure.main$repl$fn__9095.invoke (main.clj:458)
    clojure.main$repl.invokeStatic (main.clj:458)
    clojure.main$repl.doInvoke (main.clj:368)
    clojure.lang.RestFn.invoke (RestFn.java:1523)
    nrepl.middleware.interruptible_eval$evaluate.invokeStatic (interruptible_eval.clj:84)
    nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:56)
    nrepl.middleware.interruptible_eval$interruptible_eval$fn__42819$fn__42823.invoke (interruptible_eval.clj:155)
    clojure.lang.AFn.run (AFn.java:22)
    nrepl.middleware.session$session_exec$main_loop__43068$fn__43072.invoke (session.clj:190)
    nrepl.middleware.session$session_exec$main_loop__43068.invoke (session.clj:189)
    clojure.lang.AFn.run (AFn.java:22)
    java.lang.Thread.run (Thread.java:748)

【问题讨论】:

    标签: clojure clojurescript shadow-cljs


    【解决方案1】:

    我对@9​​87654322@ 知之甚少,但很可能您只是连接到 CLJ REPL,而不是您正在寻找的实际 CLJS REPL。连接始终以 CLJ 开始,您的编辑器必须将其“升级”为 CLJS。也许this 仍然是最新的?

    对于普通的 shadow-cljs,您可以通过 shadow-cljs cljs-repl app 直接访问 CLJS REPL(假设 :app 是您的构建 ID)。对于 nREPL,您的编辑器处于控制之中。我确定有一个命令。

    【讨论】:

    • 谢谢,你让我知道了这个......原来是因为我连接到repl后没有运行这个(shadow/repl :main)
    • 仅供参考,cider-connect 要求提供主机和端口,因此要将 repl 连接到 shadow-cljs,我输入 'locahost' 和来自$ npx shadow-cljs server 的 nrepl 端口输出。我想我已经从 fulcro 文档或在我设置项目的各个地方获得了连接到 shadow-cljs repl 的所有步骤。
    猜你喜欢
    • 1970-01-01
    • 2013-10-04
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多