在ClojureScript Figwheel中访问defrecord方法

4

我有一些代码在cljc文件中,可以编译成Clojure和ClojureScript。

在protocols.cljc中。

(defprotocol Transformable ".." 
    (scale [this scalar] "" ) ...)

在 pattern.cljc 中

(defrecord APattern [paths]
    Transformable
      (scale [this s] (...)) ...)

在另一个.cljc文件中

(defn f [pattern] (.scale pattern (/ 1 2)) )

在 core.cljs 文件中

(another/f pattern)

然而,我在浏览器控制台上遇到了一个错误

TypeError: pattern.scale is not a function

在core.cljs中检查模式对象的字段(使用js-keys)可以看到该对象具有称为的内容

"patterning$protocols$Transformable$scale$arity$2"

这看起来像是我的函数。那么我在ClojureScript中访问它时是否做错了什么?点号表示法不起作用吗?我需要做些其他的事情吗?


你在开发和生产模式下都遇到了这个问题吗? - Piotrek Bzdyl
我仍然只处于开发模式。 - interstar
1个回答

2

调用协议函数就像调用任何其他函数一样。因此,您的f函数应该如下所示:

(require 'protocols)
(defn f [pattern] (protocols/scale pattern (/ 1 2)) )

我遇到的问题是,我正在尝试编写一个库,既可以在ClojureScript浏览器中使用,也可以从Java中调用。我转向defprotocol和.notation的原因是希望能够创建友好的Java API,而无需编写包装器。你是说这不可能吗? - interstar
还有,当我尝试您建议的某个版本(在cljs中(protocols/scale pattern 0.5),现在它会显示“p1__25094_SHARP_.scale不是一个函数” - interstar
函数 f 是一个Clojure函数,因此如果你想从Java中使用它,你已经在Clojure领域中了,所以协议/比例是正确的使用方式。如果你想要重用的是来自Java的Pattern记录,则会使用Java语法: new pattern.APattern("").scale("bar"); 这与函数 f 完全无关。 - DanLebrero
1
此外,(println (protocols/scale (pattern/->APattern "") "")) 在 ClojureScript 和 Clojure 中都能正常工作。如果您想寻求帮助找出代码中的问题,请分享您的代码。 - DanLebrero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接