SORU
2 ŞUBAT 2010, Salı


Arama java clojure

Üst google en java clojure" eski ve clojure.lang.RT kaynak kodu derlemek için kullanmanızı öneririz. "dediğin için vurur Java zaten Clojure projeden bir kavanoz yerleşik ve birlikte sınıf içinde varsayarak Clojure aramak için nasıl net bir açıklama ile yardımcı olabilir misiniz?

CEVAP
2 ŞUBAT 2010, Salı


GüncellemeBu cevap yayınlanmıştır beri, araçların biraz değişti. Orijinal cevap sonra, mevcut araçları ile örnek oluşturmak için nasıl hakkında bilgi içeren bir güncelleme olduğu.

Bir kavanoz derleniyor ve iç yöntemleri çağırmak kadar basit değil. Ama işe yaraması için birkaç hile var. İşte bir kavanoz için derlenmiş basit Clojure bir dosya örneği:

(ns com.domain.tiny
  (:gen-class
    :name com.domain.tiny
    :methods [#^{:static true} [binomial [int int] double]]))

(defn binomial
  "Calculate the binomial coefficient."
  [n k]
  (let [a (inc n)]
    (loop [b 1
           c 1]
      (if (> b k)
        c
        (recur (inc b) (* (/ (- a b) b) c))))))

(defn -binomial
  "A Java-callable wrapper around the 'binomial' function."
  [n k]
  (binomial n k))

(defn -main []
  (println (str "(binomial 5 3): " (binomial 5 3)))
  (println (str "(binomial 10042 111): " (binomial 10042 111)))
)

Eğer çalıştırırsanız, şöyle bir şey görmelisiniz:

(binomial 5 3): 10
(binomial 10042 111): 49068389575068144946633777...

Ve burada tiny.jar -binomial işlevini çağıran bir Java programı.

import com.domain.tiny;

public class Main {

    public static void main(String[] args) {
        System.out.println("(binomial 5 3): "   tiny.binomial(5, 3));
        System.out.println("(binomial 10042, 111): "   tiny.binomial(10042, 111));
    }
}

O çıktı

(binomial 5 3): 10.0
(binomial 10042, 111): 4.9068389575068143E263

Magic ilk parça gen-class deyim :methods anahtar kelime kullanıyor. Sana bir şey Java'da statik yöntemler gibi Clojure işlevi erişmek için gerekli gibi görünüyor.

İkincisi Java tarafından çağrılan kapsayıcı bir fonksiyon oluşturmaktır. -binomial ikinci versiyonu önünde bir çizgi var dikkat edin.

Ve tabii ki Clojure kavanoz kendisi sınıf Yolu üzerinde olması gerekir. Bu örnek, Clojure-1.1.0 kavanoz kullanılır.

GüncellemeBu cevap tekrar test aşağıdaki araçları kullanarak: olmuştur

  • Clojure 1.5.1
  • Leiningen 2.1.3
  • GÖRDÜM 1.7.0 Güncelleme 25

Clojure Parçası

İlk proje ve ilişkili dizin yapısı bir Leiningen kullanarak oluşturun:

C:\projects>lein new com.domain.tiny

Şimdi, proje dizini değiştirin.

C:\projects>cd com.domain.tiny

Proje dizininde, project.clj dosyayı açın ve içeriğini aşağıda gösterildiği gibi bu gibi düzenleyin.

(defproject com.domain.tiny "0.1.0-SNAPSHOT"
  :description "An example of stand alone Clojure-Java interop"
  :url "http://clarkonium.net/2013/06/java-clojure-interop-an-update/"
  :license {:name "Eclipse Public License"
  :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.5.1"]]
  :aot :all
  :main com.domain.tiny)

Şimdi, bağımlılıklar (Clojure) kullanılabilir olduğundan emin olun.

C:\projects\com.domain.tiny>lein deps

Bu noktada Clojure kavanoz indirmekle ilgili bir mesaj görebilirsiniz.

Şimdi Clojure C:\projects\com.domain.tiny\src\com\domain\tiny.clj Clojure programın orijinal cevap gösterildiği içeren böyle bir dosya düzenlemek. (Bu dosya Leiningen proje oluşturulduğunda oluşturuldu.)

Büyüsünü burada ad alanı bildirimi. :gen-class sistem tek bir statik bir yöntem binomial bir işlevi, iki tamsayı argüman alacak ve bir çift dönen adında bir sınıf com.domain.tiny adlı oluşturmak için söyler. Benzer isimli iki işlevleri binomial geleneksel Clojure fonksiyon ve -binomial ve Java erişilebilir sarıcı vardır. İşlev adı tire -binomial not. Varsayılan önek tire, ama isterseniz başka bir şey değişmiş olabilir. -main işlevi sadece doğru sonuçları alıyoruz emin olmak için binom fonksiyonu için birkaç telefon görüşmesi yapar. Bunu yapmak için, sınıf derleme ve programı çalıştırın.

C:\projects\com.domain.tiny>lein run

Çıkış orijinal cevap gösterildiği görmelisiniz.

Şimdi bir kavanoz içinde paket ve uygun bir yere koyun. Clojure kavanoz da orada kopyalayın.

C:\projects\com.domain.tiny>lein jar
Created C:\projects\com.domain.tiny\target\com.domain.tiny-0.1.0-SNAPSHOT.jar
C:\projects\com.domain.tiny>mkdir \target\lib

C:\projects\com.domain.tiny>copy target\com.domain.tiny-0.1.0-SNAPSHOT.jar target\lib\
        1 file(s) copied.

C:\projects\com.domain.tiny>copy "C:<path to clojure jar>\clojure-1.5.1.jar" target\lib\
        1 file(s) copied.

Java Parçası

Leiningen yerleşik görev, lein-javac Java derleme ile yardımcı olmak gerekir. Ne yazık ki, sürüm 2.1.3 kırık gibi görünüyor. Yüklü olduğunu GÖRDÜM bulamıyor ve Maven depo bulamıyor. Hem yollar benim sistemde boşluk gömülü. Sorun olduğunu varsayıyorum. Herhangi bir Java IDE derleme ve paketleme de ele verebilir. Ama bu yazı için, eski okul ve komut satırında yapıyoruz.

İlk içeriğini özgün yanıt gösterilen dosya Main.java oluşturun.

Java kısmını derlemek için

javac -g -cp target\com.domain.tiny-0.1.0-SNAPSHOT.jar -d target\src\com\domain\Main.java

Şimdi meta-bilgi ile bir dosya oluşturmak istediğimiz jar eklemek oluşturun. Manifest.txt, eklenti, aşağıdaki metin

Class-Path: lib\com.domain.tiny-0.1.0-SNAPSHOT.jar lib\clojure-1.5.1.jar
Main-Class: Main

Şimdi hepsi koca bir kavanoz dosyası, Clojure programımız ve Clojure kavanozun içine dahil paket.

C:\projects\com.domain.tiny\target>jar cfm Interop.jar Manifest.txt Main.class lib\com.domain.tiny-0.1.0-SNAPSHOT.jar lib\clojure-1.5.1.jar

Programı çalıştırmak için:

C:\projects\com.domain.tiny\target>java -jar Interop.jar
(binomial 5 3): 10.0
(binomial 10042, 111): 4.9068389575068143E263

Çıkış o Clojure tek başına ürettiği için esasen aynıdır, ama sonuç bir Java çift dönüştürüldü.

Belirtildiği gibi, bir Java IDE muhtemelen dağınık derleme değişkenleri ve ambalaj ilgilenir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Erica Griffin

    Erica Griffi

    8 HAZİRAN 2009
  • Marissah Simonini

    Marissah Sim

    25 HAZİRAN 2013
  • Tips On Linux

    Tips On Linu

    26 Temmuz 2008