跳转到内容

Clojure 编程/示例

来自维基教科书,开放世界中的开放书籍

此页面收集了 Clojure 代码示例。这是一个动态列表,欢迎您贡献。为了使它尽可能相关,请遵守以下准则

  • 为您的条目创建一个单独的页面。将其放在 Clojure_Programming/Examples/Your_Example_Name 中
  • 创建一个关于您的示例的一段摘要,并将其放在此页面中。
  • 记住链接到您的示例

感谢您为帮助 Clojure 社区做出的贡献!

可以在此处找到 JDBC 信息。该页面仍在开发中。

Peter Norvig 写了一个关于拼写校正器的优秀示例。您可以查看如何编写拼写校正器以获得更详细的解释。

您可以查看 Clojure 示例此处

通过网络访问 REPL 对于许多情况非常有用,从设计网站到调试太空中的卫星。这里是一个示例。

简单的 GUI 应用程序示例(来自讨论组,更新至 20080329 版)。它基于 Swing,您可以在这里找到它。

斐波那契数列无限递归序列 的一个经典示例。Clojure 的延迟函数是实现这种数学构造的绝佳方法。您可以在这里看到一个详细的示例。

通过COM 与其他程序进行接口交互在Java 中使用 JACOB 库可以轻松实现。但是,在与应用程序交互时处理所有底层接口非常繁琐。尤其是当接口是为 C 而不是为 Java 设计的,更不用说 Clojure 了。因此,我们将尝试利用 Clojure 的强大功能来改善这种情况。

详细解释在此

本教程 解释了如何创建简单的“Hello World!”小程序。本文还解释了如何签名小程序(如果需要反射)。

genclass 和 finalize

[编辑 | 编辑源代码]

gen-class 函数提供了 Clojure 中最通用和最强大的机制来定义新的 Java 类。如果您需要实现现有的接口,您可能可以使用更简单的 proxy 函数,但如果您需要定义新的 Java 实例方法,您可能需要使用 gen-and-load-classgen-and-save-class

作为快速介绍,以下是一个名为 MyClass 的新类在名为 foo 的包中的示例。此类有两个方法:mymethod,一个标准的 Java finalize

(gen-and-load-class 'foo.MyClass
   :methods [['mymethod [String] String]
             ['finalize [] Void/TYPE]])

此时,类已存在并已加载到 JVM 中,但尚未有用,因为方法没有定义。像这样定义它们

(clojure/ns foo)

(defn MyClass-mymethod [this m]
  (str "Your arg was: " m))

(defn MyClass-finalize [this]
  (println "Finalizing " this))

现在,此类可以在 Clojure 中像任何 Java 类一样使用

(println (.mymethod (new foo.MyClass) "foo"))

该示例创建了一个新实例,调用了 mymethod 并打印了返回值。finalize 方法可能尚未被调用,但显式调用垃圾收集器可能会触发它

(System/gc)

通过方法名称(字符串)调用 Java 方法

[编辑 | 编辑源代码]

有关更具对话性的方法,请参阅Google Groups 原始线程

感谢 Timothy Pratley、pmf 和 Michael Wood 帮助找到了解决方法。

user=> (defn str-invoke [instance method-str & args]
            (clojure.lang.Reflector/invokeInstanceMethod 
                instance 
                method-str 
                (to-array args)))
#'user/str-invoke
user=> (def i "sampleString")(def m "substring")(def args [2,3])
#'user/i
#'user/m
#'user/args
user=> (apply str-invoke i m args)                              
"m"
user=>

通过属性名称(字符串)设置 Java 属性

[编辑 | 编辑源代码]
(defn str-set [instance field-str arg]
    (clojure.lang.Reflector/setInstanceField
        instance 
        field-str 
        arg))
华夏公益教科书