2012-03-13 27 views
27

Tôi đang tìm hướng dẫn về lập trình đa ngôn ngữ trong hai ngôn ngữ này.Scala và Clojure cả hai trong một dự án

Tôi biết rằng interop between them is possible, vì cả hai đều chạy trên cùng một máy ảo Java và cả hai đều được biên dịch sang cùng bytecode. Nhưng có một số cumbersomes:

  • Tôi có thể sử dụng để biên dịch mã Clojure không?
  • Tôi có thể sử dụng để biên dịch mã Scala không?

( Yeah, yeah, tôi biết tôi có thể chỉ cần cắm vào lọ từ một ngôn ngữ để dự án trong lang khác.)

Vì vậy, câu hỏi là Làm thế nào để thiết lập phát triển nhiều thứ tiếng trong Scala và Clojure?

+0

Để giảm boilerplate, tôi không biết bất kỳ thư viện hiện có nào. Nhưng giữa các macro Clojure và các chuyển đổi tiềm ẩn của Scala, bạn có thể đi một chặng đường dài. – leedm777

+0

Đừng hỏi nhiều câu hỏi trong một câu hỏi. Đó là không công bằng đối với những người có thể trả lời một phần nhưng không phải là khác, và câu trả lời chấp nhận có thể không phải là câu trả lời tốt nhất cho một khía cạnh. –

+0

@ DanielC.Sobral Nói chung, tôi đang cố tránh tình huống đó. Vì lý do đó tôi đã viết dòng cuối cùng. Các câu hỏi trong nội dung mô tả những gì tôi muốn thấy trong hướng dẫn đó (tôi đã mong đợi liên kết đến một số bài đăng hoặc bất kỳ bài đăng nào). –

Trả lời

17

Các Anser ngắn: sử dụng Maven3

maven3 với các plugin zi cho clojure và maven-scala-plugin sẽ cho phép bạn có một dự án có nhiều thứ tiếng tích hợp độc đáo nơi bạn có thể sử dụng bất kỳ ngôn ngữ bạn muốn miễn là Java của nó ;)

Một trong những thay đổi lớn trong Maven3 là một sự thúc đẩy đối với lập trình JVM đa ngôn ngữ bao gồm khả năng viết POM bằng nhiều ngôn ngữ. Bạn mất đi sự đánh bóng của leiningen khi tham gia tuyến đường này, mặc dù bạn thu được rất nhiều lợi nhuận.

+0

+1 cho điều này: Maven là tuyệt vời cho mã hóa polyglot trên JVM. Tôi có ít kinh nghiệm hơn với Scala + Maven, nhưng nó hoạt động tốt cho Java và Clojure trong cùng một dự án. – mikera

3

Làm phương án thay thế maven: gradle có thể biên dịch cả hai ngôn ngữ.

2

Đặc điểm Dynamic của Scala được tạo để cho phép tích hợp dễ dàng hơn với các ngôn ngữ được nhập động, nhưng bạn sẽ phải viết giao nhận của riêng bạn. Ngoài ra, bạn sẽ phải viết lại nó với Scala 2.10, vì nó đã được thay đổi một chút. Có lẽ, trên thực tế, bạn nên sử dụng Scala 2.10 (cột mốc 2 có sẵn). Scala 2.10 Hỗ trợ CAT cũng có thể giúp bạn tích hợp ở phía Scala.

Bạn có thể sử dụng SBT để biên dịch Clojure, vì SBT rất linh hoạt, nhưng, thực tế hơn, không có hỗ trợ biên dịch Clojure. Bạn có thể xem this plugin làm ví dụ về cách thêm bản dịch của các ngôn ngữ khác.

Tôi thấy nó tò mò rằng quá ít sự tích hợp giữa Scala và Clojure dường như tồn tại. Chúng thường được so sánh, và bạn sẽ thường thấy mọi người nói rằng nó chọn cái kia.

5

Cá nhân, tôi sẽ tránh xa việc sử dụng Maven trực tiếp mặc dù là câu trả lời được chấp nhận.Đây là định nghĩa dự án Leiningen đơn giản:

  • tạo nguồn Java từ ngữ pháp ANTLR4 (làm tiền thưởng);
  • biên dịch các nguồn Java;
  • biên dịch nguồn Scala (Tôi thích sử dụng Scala trên đầu trang của mã Java ANTLR4 được tạo vì nó ngắn gọn và dễ chịu hơn để làm việc);
  • tiếp tục với nội dung của Clojure.
 
(defproject polyglot "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :plugins [[lein-antlr4 "0.1.0-SNAPSHOT"] 
      [lein-scalac "0.1.0"]] 
    :dependencies [[org.clojure/clojure "1.5.1"] 
       [org.antlr/antlr4 "4.0"] 
       [org.scala-lang/scala-library "2.10.1"]] 
    :warn-on-reflection true 
    :antlr4-source-paths ["antlr4"] 
    :antlr4-options {:package "parser" :listener true} 
    :antlr4-compile-path "target/antlr4/parser" 
    :java-source-paths ["target/antlr4/parser" "src/java"] 
    :scala-source-path "src/scala" 
    :prep-tasks ["antlr4" "javac" "scalac" "compile"]) 

Để sử dụng ANTLR4 Plugin tải về và 'Lein cài đặt' plugin lein-antlr4. Nếu bạn không cần nó, chỉ cần loại bỏ các dòng có liên quan từ định nghĩa dự án.

Để sử dụng Scala plugin tôi cần thiết để download nó và thay đổi

[org.scala-lang/scala-compiler "2.9.1"] 

để

[org.scala-lang/scala-compiler "2.10.1"] 

trong project.clj plugin, sau đó 'Lein cài đặt' nó tại địa phương. Với phiên bản phụ thuộc cũ hơn, tôi đã nhận được

java.lang.Error: typeConstructor inapplicable for <none> 

từ trình biên dịch Scala.

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