Как передать список в качестве параметра функции clojure - PullRequest
2 голосов
/ 05 октября 2011

Как передать список (коллекцию) в качестве параметра функции clojure, эта clojure вызывается кодом Java.

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Clojure:

(ns utils ; Sets the namespace to utils
   (:gen-class :name Utils ; The keyword :gen-class declares that
                           ; I want this compiled as a class. The
                           ; :name declares the name (and the package)
                           ; of the class I want created. 
               :methods [#^{:static true} [sum [java.util.Collection] long]]))
                           ; In the vector following :methods I've declared
                           ; the methods I want to have available in the
                           ; generated class. So I want the function 'sum'
                           ; which takes a 'java.util.Collection' as an
                           ; argument and returns a value of type 'long'.
                           ; The metadata declaration '#^{:static true}
                           ; signals that I want this method to be declared
                           ; static.

; The Clojure function. Takes a collection and
; sums the values in the collection using 'reduce'
; and '+'.
(defn sum [coll] (reduce + coll))

; The wrapper function that is available to Java.
; Just calls 'sum'.
(defn -sum [coll] (sum coll))

Java:

public class CalculateSum {
  public static void main(String[] args) {
    java.util.List<Integer> xs = new java.util.ArrayList<Integer>();
    xs.add(10);
    xs.add(5);
    System.out.println(Utils.sum(xs));
  }
}

Это распечатывает 15.

0 голосов
/ 05 октября 2011

Возможно, вы захотите посмотреть на отличные ответы на вопрос о вызове clojure из Java

В списке нет ничего особенного: любой объект Java может быть передан в качестве параметра функции Clojure таким же образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...