Clojure的:gen-class和双数组

3

我正在尝试 :gen-class 一个接受二维 Double 数组作为输入的 fn。我已经看过这个帖子和解决方案(链接),涉及类似的主题,但我仍然无法产生有效的解决方案。

(ns gui.heatmap
  (:gen-class
    :name gui.Heatmap
    :methods [[heat-map2 ["[[D"] org.jfree.chart.JFreeChart]]))

(defn foo [dbl-array]
  ...)

我使用基于输入的type,来使用"[[D"。这将编译成一个 .class 文件。
现在,当我移动到另一个 .clj 文件时,我遇到了以下问题。
(ns ...
  (import (gui.Heatmap)))

(defn bar [args]
  ...
  (.foo
    (into-array
      (vector
        (double-array <list of numbers>)
        (double-array <list of numbers>)
        (double-array <list of numbers>)))))

当我从repl调用bar时,我收到以下错误信息: java.lang.IllegalArgumentException: No matching field found: heat_map2 for class [[D 有什么想法吗?
2个回答

3
你缺少对象。 (.foo (into-array ...))(.foo (Heatmap.) (into-array...))之间的区别在于前者没有指定对象,后者使用了gui.Heatmap作为对象。请注意,你还应该require你的gui.Heatmap命名空间。否则,在编译...命名空间之前,会遇到问题。此时导入会失败,因为类尚未生成。添加require将解决这个问题。编辑:为了澄清事情。修复缺少的对象、添加require、修复前缀(dbyrne发现的好地方!)、修复:import子句(也是错误的)。
(ns gui.heatmap
  (:gen-class
    :name gui.Heatmap
    :methods [[heat-map2 ["[[D"] org.jfree.chart.JFreeChart]]))

(defn -foo [dbl-array]
  ...)

(ns ...
  (import gui.Heatmap))

(defn bar [args]
  ...
  (.foo
    (Heatmap.)
    (into-array
      (vector
        (double-array )
        (double-array )
        (double-array )))))

如果我将 foo 声明为静态的(即 (defn ^{:static true} -foo ...)),那么我是否可以通过 (Heatmap/-foo (into-array...)) 调用 foo - cryptic_star
即使没有使用静态,我仍然被告知无法解析类名“热力图”,尽管我能看到它已经生成。 - cryptic_star
我更新了这个例子。导入语句还有一个问题。我还添加了dbyrne的函数前缀修复。 - kotarak

2

Kotarak的回答很好。然而,另一个问题是你需要将函数命名为-foo而不是foo。要么这样做,要么在:gen-class中更改:prefix


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