跳轉到內容

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))
華夏公益教科書