2015-01-13 12 views
6

Tôi có đoạn mã sau:Có mẹo nào để sử dụng macro trong cùng một tệp mà chúng được xác định không?

object Macros { 

    import scala.language.experimental.macros 
    import scala.reflect.macros.blackbox 

    def hello(): Unit = macro hello_impl 

    def hello_impl(c: blackbox.Context)(): c.Expr[Unit] = { 
    import c.universe._ 
    reify { 
     println("Hello World!") 
    } 
    } 
} 


object Main { 

    def main(args: Array[String]): Unit = { 
    Macros.hello() 
    } 

} 

Nó ném lỗi biên dịch sau đây:

Error:(21, 17) macro implementation not found: hello 
(the most common reason for that is that you cannot use macro implementations in the same compilation run that defines them) 
    Macros.hello() 
       ^

Câu hỏi của tôi là: là có một cách để "đánh lừa" trình biên dịch để sử dụng mở rộng vĩ mô trong cùng một tệp chúng được xác định? Động cơ của tôi là như sau: Tôi thích viết mã ở Scala, và gần đây tôi đã gửi một số vấn đề trong thẩm phán trực tuyến Codeforces và một số công trình xây dựng Scala hóa ra rất chậm. Vì vậy, tôi muốn tạo ra một số mở rộng vĩ mô để thực hiện những công trình xây dựng nhanh chóng. Nhưng tôi không thể gửi nhiều hơn một tập tin.

Cảm ơn!

+0

Tôi không nghĩ điều này là có thể. Không chắc chắn nhưng nó âm thanh lạ để tạo ra một vĩ mô (mà cần phải được biên dịch) và sau đó sử dụng nó khi nó không được biên dịch. Tuy nhiên bạn có thể xác định chúng trong các tệp khác nhau? Không chắc chắn mặc dù. Một điều khác khi làm CF với Scala là bạn nên tránh những thứ như bộ lọc, flatMap vv, vì chúng chậm trên các bộ sưu tập lớn hơn. Gắn bó với mảng và bạn sẽ nhận được hiệu suất gần-java trên các bộ sưu tập lớn hơn. –

+0

Tôi đồng ý với bạn về chính sách "gắn bó với mảng". Nhưng nó chỉ ra rằng sự hiểu biết là cực kỳ chậm (có lẽ bởi vì chúng được chuyển đổi thành một chuỗi bản đồ-bộ lọc phẳng bản đồ) ngay cả đối với mảng và đó là một nỗi đau lớn để sử dụng trong khi tất cả xung quanh để lặp lại. Ví dụ, nó thích hợp hơn để viết bằng Java hơn là viết http://codeforces.com/contest/166/submission/8828271 này chỉ vì những hiểu biết gây ra nó cho TLE. – ale64bit

+0

Một điều tôi thấy với mã đó là Máy quét siêu chậm. Viết lớp của riêng bạn bằng cách sử dụng inputstreams để thay thế. Kiểm tra điều này: https://kattis.csc.kth.se/doc/src/Kattio.java (trình đọc tùy chỉnh của trường của tôi) –

Trả lời

5

Hiện tại, điều này là không thể trong bản phát hành sản phẩm của Scala 2.10 và 2.11. Chúng ta có thể đạt được điều này với scala.meta, nhưng điều đó tốt trong tương lai.

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