2015-05-20 16 views
7

Ben scala makroları için yeniyim ve ilk günümü yazmaya çalışıyorum birkaç gün geçirdim. Şimdiye kadar quasiquotes birleştirme ile ilgili bir sorunum var. vaka maddelerinin bir listesi vardırScala quasiquote birleştirme

, en aşağıdaki diyelim:

val cases = cq"x => 1 " :: cq"_ => 0 " :: Nil 

Ve ondan bir kısmi fonksiyonu inşa etmek gerekir. Sorun şu ki, bunları final quizquote'a nasıl yapıştıracağım konusunda bir fikrim yok. dokümantasyon böyle bir şey yapması gerektiğini söyledi:

q"{ case ..$cases }" 

ama bunu eğer çalışmaz.

Böyle bir listeden bir Kısmi İşlev oluşturmanın bir yolu var mı?

Yardımlarınız için teşekkür ederiz. 2.11.2 benim için

+0

Bunun doğru bir yaklaşım olduğuna inanıyorum. Tam olarak hangi hatanın var? – Odomontois

+0

Ayrıca sizin deseniniz biraz garip 'x => 1' herhangi bir ifadeye ait matematiktir, eğer' x' adlı bir yerel değere atıf yapıyorsanız, '' '' '' '' '' '' '' 1 '' kullanmalısınız, patern – Odomontois

+1

Hata aşağıdaki gibidir: : makro genişletme sırasında istisna: java.lang.IllegalArgumentException: scala.collection.immutable.List (case (x @ _) => 1, case _ => 0) desen eşleşme örneğinin geçerli temsilidir. –

cevap

2

aşağıdaki çalışır:

import scala.reflect.macros.Context 
object Macros { 
    def partial: PartialFunction[Int, Int] = macro partialImpl 
    def partialImpl(c: Context): c.Expr[PartialFunction[Int, Int]]= { 
     import c.universe._ 
     val cases = cq"x => 1 " :: cq"_ => 0 " :: Nil 
     val pf = q"{ case ..$cases } : PartialFunction[Int, Int]" 
     c.Expr[PartialFunction[Int, Int]](pf) 

    } 
} 

Sonra örneğin, ya Macros.partial.isDefinedAt(2) için, Macros.partial(1) çağırabilir.

Bu işi yapabilmek için q"{ case ..$cases } : PartialFunction[Int, Int]" numaralı başvuruda açıkça PartialFunction[Int, Int]'u kullanmam gerektiğini unutmayın. Açık tip tanımı olmadan çalışmadı (aksi halde PartialFunction[Any, Int] varsayar). Kısmi işlevler için sözdizimi sözdizimi belirtimi

. Saf bir sözdizimi ağacı olarak çalışır, ancak açıkça belirtilmedikçe bir makro tarafından PartialFunction[Any, T] dışında bir yazılan ifade olarak yorumlanamaz.

+0

Anon funk ile eşleşen desen, beklenen türe bağlı olarak İşlev veya Kısmi İşlev olabilir. –

+0

Kodunuzda bir hata var: 'Kısmi İşlev [Int, Int] {durum ...}', tüm etki alanında tanımlanmış bir Kısmi İşlev oluşturur. İstediğin şey bunun yerine {case ...}: PartialFunction [Int, Int] ' –

+0

Doğru. İyi yakalama. Sabit. –