当前位置: 首页 > 知识库问答 >
问题:

编译Clojure*. clj到*. class,部分函数不生成

闾丘永春
2023-03-14

我遵循这里的说明,并试图通过调用lein jar从clj源生成一个Java类。

但是,当我稍微编辑代码以添加自己的测试函数时:

(ns some.Example
  (:gen-class))

(defn -main
  [greetee]
  (println (str "Hello " greetee "!")))

(defn -foo []
  "foo bar")

.. 然后用lein jar生成一个Java类文件(我在文章末尾追加了project.clj),我发现生成的jar包含作为内部类的方法:

$ jar tvf example-1.0.0.jar 
    76 Sun Feb 17 20:56:24 EET 2013 META-INF/MANIFEST.MF
  1225 Sun Feb 17 20:56:24 EET 2013 META-INF/maven/some/example/pom.xml
    87 Sun Feb 17 20:56:24 EET 2013 META-INF/maven/some/example/pom.properties
  2697 Sun Feb 17 20:56:24 EET 2013 some/Example__init.class
  1499 Sun Feb 17 20:56:24 EET 2013 some/Example$loading__4784__auto__.class
  1035 Sun Feb 17 20:56:24 EET 2013 some/Example$_main.class
   565 Sun Feb 17 20:56:24 EET 2013 some/Example$_foo.class
  1771 Sun Feb 17 20:56:24 EET 2013 some/Example.class
   162 Sun Feb 17 18:03:12 EET 2013 project.clj
   129 Sun Feb 17 19:23:54 EET 2013 some/Example.clj

那是一些。示例类只包含main方法,不包含foo:

$ javap some.Example
public class some.Example {
  public static {};
  public some.Example();
  public java.lang.Object clone();
  public int hashCode();
  public java.lang.String toString();
  public boolean equals(java.lang.Object);
  public static void main(java.lang.String[]);
}

所以问题是:我们如何指定一个clj Clojure文件来生成一个Java类,该类包含许多静态和实例方法,目的是从Java代码中调用这些方法?

(defproject some/example "1.0.0"
  :description "A sample project"
  :dependencies [[org.clojure/clojure "1.4.0"]]
  :aot [some.Example]
  :source-paths ["."]
  )

共有1个答案

柯苗宣
2023-03-14

你需要声明你的类将要拥有的方法:

(ns some.Example
  (:gen-class
     :methods [[foo [] String]]))

请注意,这将foo声明为非静态方法,因此它还需要使用一个this参数:

(defn -foo [this]
  "foo bar")

如果希望方法是静态的,需要附加一些元数据:

(ns some.Example
      (:gen-class
         :methods [#^{:static true}[bar [] int]]))
(defn -bar []
  3)

试着读这篇文章,它会更快地切入要点。

 类似资料:
  • 我正在使用英特尔SSE/AVX/FMA内部函数来实现一些数学函数的完美内联SSE/AVX指令。 给定以下代码 clang 3.9生成的程序集-march=x86-64-mfma-O3 虽然为sqrt生成的代码很好,但与std fma(依赖于编译器内部std::fma)相比,fma中存在不必要的VxORP(将绝对未使用的xmm3寄存器设置为零)和MOVS指令 GCC 6.2生成的程序集-march=

  • 我最近开始学习Clojure,想知道是否有一种执行简单. clj文件的标准方法。 我已经安装了Leiningen,并创建了我的第一个项目称为我的东西使用lein新应用程序我的东西。 管理我的东西。core,我从lein run开始: 接下来,我尝试了lein repl,接着是: 我还使用lein repl进行了一些基本评估: 我试着在我的东西里定义这个函数。核心: 我得到以下错误:clojure.

  • Compiler functions are called only during compilation of the template. They are useful for injecting PHP code or time-sensitive static content into the template. If there is both a compiler function a

  • 问题内容: 我是ReactJS的新手,正在尝试了解什么是将代码部署到生产中的最佳方法。按照下面的链接,我正在使用babel作为下面的代码进行构建,但是我想知道 这是否很好,或者是否有 将ReactJS部署到生产中的 其他最佳实践 : http://www.sitepoint.com/getting-started-react- jsx/ 这是我的index.html和main.js文件: inde

  • 我试着实现了一个列表容器,并决定将一些通用函数如< code>sum()移到基类,这样我就可以在其他容器中重用它们。 所有的基本支持类需要的是三个方法 empty()、 和 。我不能使这些纯粹的虚拟,因为支持类永远不会被实例化。但它仍然必须使用这些方法来实现自己的方法,如 我试过这样的东西: 但是尝试使用< code>sum()会导致编译错误 对于、和中的每一个。 有什么建议吗?

  • void unregister_compiler_function(string name) Use this to dynamically unregister a compiler function. Pass in the name of the compiler function. 动态注销一个编译函数,参数name是编译函数的名称。