2015-01-13 14 views
6

Aşağıdaki kod var:Makroları tanımlandıkları aynı dosyada kullanmak için herhangi bir numara var mı?

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() 
    } 

} 

Aşağıdaki derleme hata atar:

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() 
       ^

Sorum şu: makro açılımlarını kullanmak için derleyici "aptal" bir yolu yoktur aynı dosya tanımlanmış mı? Benim motivasyonum şu: Scala'da kod yazmaktan hoşlanıyorum ve son zamanlarda online yargıç Codeforces'da bazı problemler gönderiyordum ve bazı Scala yapıları çok yavaş çıktı. Dolayısıyla, bu yapıları hızlı bir şekilde yürütmek için bazı makro genişletmeler oluşturmak istiyorum. Ancak birden fazla dosya gönderemiyorum.

Teşekkürler!

+0

Bunun mümkün olduğunu düşünmüyorum. Emin değilim ama bir makro (derlenmesi gereken) oluşturmak ve sonra derlenmediğinde kullanmak garip geliyor. Ancak bunları farklı dosyalarda tanımlayabilirsiniz? Yine de emin değilim. Scala ile CF yaparken bir başka şey, daha büyük koleksiyonlarda yavaş olduklarından, filtreler, flatMap vb. Gibi şeylerden kaçınmanız gerektiğidir. Dizilere yapış ve daha büyük koleksiyonlarda java performansına sahip olmalısın. –

+0

"Stick-to-arrays" politikası hakkında size katılıyorum. Ancak, anlaşılmalar inanılmaz derecede yavaştır (muhtemelen bir harita düzlemi MAP filtresi dizisine dönüştürüldükleri için), diziler için bile olsalar ve her şey tekrar tekrar kullanılırken kullanmak için büyük bir acıdır. Örneğin, bu http://codeforces.com/contest/166/submission/8828271 adresini yazmaktan ziyade, Java'da yazmayı tercih etmeniz, çünkü bu durumun anlaşılmasının nedeni TLE'ye yol açmasıdır. – ale64bit

+0

Bu kodla gördüğüm bir şey, Tarayıcı'nın süper yavaş olmasıdır. Bunun yerine giriş sınıflarını kullanarak kendi sınıfınızı yazın. Şuna bir göz atın: https://kattis.csc.kth.se/doc/src/Kattio.java (Okulun okulun özel okuyucu) –

cevap

5

Şu anda Scala 2.10 ve 2.11'in üretim sürümlerinde bu mümkün değildir. Bunu scala.meta ile başarabiliriz, ama gelecekte bu iyi.

İlgili konular