2012-07-09 30 views
12

Khi sử dụng chuỗi công cụ SBT trong Scala, có thể viết một tác vụ sẽ đọc một phần đặc biệt của nguồn dự án để tạo mã scala lúc biên dịch không.Tạo mã bằng Scala

Bất kỳ ý tưởng hoặc thậm chí bài viết/hướng dẫn về điều này? Tôi đang tìm một cái gì đó khá giống với mẫu Haskell.

+0

Vâng, đó là có thể. Tôi khá chắc chắn có plugin làm điều đó. Bạn đã xem danh sách các plugin hiện tại chưa? –

Trả lời

13

treehugger.scala là một thư viện được thiết kế cho thế hệ mã.

import treehugger.forest._ 
import definitions._ 
import treehuggerDSL._ 

val tree: Tree = Predef_println APPLY LIT("Hello, world!") 

println(tree) 
println(treeToString(tree)) 

Đoạn mã trên sẽ in hai dòng:

Apply(Ident(println),List(Literal(Constant(Hello, world!)))) 
println("Hello, world!") 

Treehugger không tạo ra một AST, nhưng không tuân thủ để AST scalac của.

+5

Chỉ cần làm rõ: treehugger = tạo mã nguồn; macro = Tạo AST. Trước đây là công nghệ thấp, mà thực tế có thể là một lợi thế :) – retronym

+0

@EugeneYokota, nó có kế hoạch phát hành gần đây cho Scala 2.10 không? – jeslg

7

Scala 2.10 có hỗ trợ thử nghiệm cho các macro cũng giống như việc tạo mã thời gian biên dịch phức tạp. Xem here để biết thêm chi tiết.

Có một số ví dụ thú vị về kho lưu trữ macrocosm của Jason Zaugg, và thư viện SLICK là một sự tiến hóa của ScalaQuery SQL DSL cho phép truy vấn cơ sở dữ liệu an toàn kiểu (và bộ sưu tập) được thể hiện theo cách LINQ.

Và ví dụ này, từ thư viện expecty khẳng định:

import org.expecty.Expecty 

case class Person(name: String = "Fred", age: Int = 42) { 
    def say(words: String*) = words.mkString(" ") 
} 

val person = Person() 
val expect = new Expecty() 

... 
val word1 = "ping" 
val word2 = "pong" 

expect { 
    person.say(word1, word2) == "pong pong" 
} 

yielding:

java.lang.AssertionError: 

person.say(word1, word2) == "pong pong" 
|  | |  |  | 
|  | ping pong false 
|  ping pong 
Person(Fred,42) 
+0

Khi nào chúng được mong đợi là một tính năng đầy đủ? – Lanbo

+1

Tôi tin rằng nhóm phát triển trình biên dịch đang thử nghiệm chúng trong phiên bản 2.10 để xem cộng đồng có thể tìm thấy chúng hữu ích như thế nào. Tư duy hiện tại (như lần cuối cùng tôi đọc danh sách gửi thư trong nội bộ, cách đây vài tuần) là họ vẫn còn để mở khả năng chỉ có họ làm thử nghiệm. Nhưng nếu hỗ trợ cộng đồng là rất tích cực, tôi tưởng tượng họ sẽ được chấp nhận. Có những người khác trên trang web này, những người có thể cung cấp cho bạn một câu trả lời dứt khoát hơn mặc dù. –

+1

Chúng trông rất giống với Mẫu Haskell và được sử dụng rộng rãi. Mặc dù trong nhiều trường hợp mà Scala có thể phục vụ tốt mà không có điều này (như mở rộng tự động cho các lớp phức tạp). Nhưng với mục đích của tôi, tiền xử lý tài sản trên biên dịch, nó là phù hợp. – Lanbo

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