2010-02-02 31 views
12

Tôi có thể thực hiện một dự án Java lớn và bắt đầu thêm các mô-đun Clojure như thế nào? Ví dụ: trong mã bên dưới, tôi muốn làm cho các chức năng sau có sẵn trong Java: trạng thái ?, zip ?, danh sách nhà nước, danh sách zipcode. Hai biến vị ngữ sẽ trả về một boolean, nhưng "getters" sẽ trả về mảng.Lồng ghép Clojure vào một dự án Java hiện có?

 
(def *states* (list "NJ" "NY" "CA")) 
(def *zipcodes* (list 12345 54343 98765)) 

(defn member [x sq] 
    (if (seq sq) 
    (if (= x (first sq)) 
     sq 
     (recur x (rest sq))))) 

(defn state? [aState] 
    (not (= (member aState *states*) nil))) 

(defn zip? [aZip] 
    (not (= (member aZip *zipcodes*) nil))) 

(defn state-list [] 
    *states*) 

(defn zipcode-list [] 
    *zipcodes*) 
;; --------------- 
(state? "AA") 
(state? "CA") 
(zip? 11111) 
(zip? 12345) 

Trả lời

10

tôi sẽ biên dịch nó bằng cách sử leininge n sau đó thêm file jar cho dự án java của tôi như là một xây dựng dep. Đây là một số tuyệt vời video khi sử dụng leiningen. thì bạn sẽ gọi nó trực tiếp từ java. Leiningen có một lựa chọn uberjar mà bulds trong clojure và tất cả các phụ thuộc clojure của bạn, do đó bạn chỉ phải lo lắng về một tập tin. Tôi thích điều này vì công việc của nó ít hơn.

Một cách tiếp cận thân thiện hơn java sẽ có thêm một nhiệm vụ kiến ​​để xây dựng nó cùng với các dự án java chỉ là một chút nhiều hơn công việc của mình

cho các chức năng mà cần phải trả lại mảng java thích gọi to-array trên chúng

trái với nhiều lần truy cập "gọi clojure từ java" hàng đầu, bạn không cần phải gọi RT thời gian chạy clojure.

PS: dòng thẻ yêu thích của tôi "Tôi muốn sử dụng một thư viện java gọi clojure" Tôi hỏi Giàu ông cho biết đây là mát mẻ;)

+0

tôi nhìn README leiningen nhưng tôi không nhìn thấy bất cứ điều gì mà giải thích điều này. Biết về bất kỳ blog, vv mà có thể giải thích điều này trong một số chi tiết? Danh sách của tôi sẽ được trả về Java như thế nào? –

+0

bạn chuyển đổi vector clojure thành danh sách java bằng to-list và trả về từ hàm. thêm ở đây: http://clojure.org/java_interop#toc27 –

+1

Tôi nghĩ lưới đang thiếu các giải thích về điều này. –

2

Nó là dễ dàng hơn để có một ứng dụng Java hiện có và bọc nó trong Clojure so với cách khác xung quanh, bởi vì Java interop từ Clojure rất đơn giản.

Khi bạn đang hỏi cách truy cập Clojure từ Java, câu trả lời là bạn cần khởi động tải mã Clojure hoặc bạn cần tạo các tệp lớp Java có thể được sử dụng từ dự án Java của bạn. Bootstrapping liên quan đến việc liên kết với jar clojure và truy cập chức năng tải để tải nguồn clojure. Để tạo các lớp Java nhìn vào AOT (xem ví dụ trên trang web).

+5

Tôi nghi ngờ nếu nhiều người có tùy chọn chuyển dự án Java kế thừa thành dự án "Clojure". Giải pháp thực tế duy nhất là để có thể cho phép nhóm tiếp tục trong Java và cho phép một phần của dự án được thực hiện trong Clojure, làm cho thực tế rằng bạn đang sử dụng Clojure phần nào trong suốt. –

+0

Thực ra tôi có ý kiến ​​ngược lại chính xác :) Hãy nghĩ về nó về Python/C++, mọi người có rất nhiều di sản C++ được gói gọn trong Python ... không quá nhiều ứng dụng kế thừa C++ gọi ra Python. –

+0

Lisp khó bán hơn Python. –

2

pháp được đề nghị của tôi là như sau:

  • Tiếp tục để quản lý các dự án Java với bất cứ điều gì bạn chính là công cụ xây dựng (có lẽ Maven?)
  • Thêm Clojure như một sự phụ thuộc. Nó sẽ hoạt động giống như bất kỳ thư viện nào khác .jar tệp
  • Gọi vào mã Clojure từ Java. Một trường hợp sử dụng điển hình sẽ được require một không gian tên để làm điều này, lấy một tham chiếu đến bất cứ điều gì IFn bạn muốn gọi và gọi hàm qua IFn.invoke

Tôi khuyên bạn nên phương pháp này vì nó nói chung là đơn giản để thêm Clojure đến một Dự án Java thay vì vòng tròn khác: điều này đặc biệt đúng nếu bạn có các nhà phát triển khác xem xét hoặc đang sử dụng các công cụ giả định một dự án Java thông thường.Nó cũng ít đáng sợ hơn đối với các nhà quản lý: tất cả những gì bạn đang làm là sử dụng một thư viện Java phụ :-)

Tôi đã tạo một thư viện tiện ích nhỏ, thực hiện rất nhiều công việc cần thiết để gọi vào Clojure từ Java. :

Các vấn đề liên quan