scala-macros

    2熱度

    1回答

    我有一個函數 def grammar(block: => Any): Grammar = macro grammarImpl 與宏實現 def grammarImpl(c: Context)(block: c.Tree): c.Expr[Grammar] = { q"null" } 但我得到一個錯誤,類型不匹配;發現:c.universe.Literal需要:c.Expr [

    6熱度

    2回答

    我在想是否可以在Scala中定義類型如NegativeNumber。這種類型將是一個負數,它將由編譯器同樣進行檢查,以整型,字符串等 val x: NegativeNumber = -34 val y: NegativeNumber = 34 // should not compile 同樣: val s: ContainsHello = "hello world" val s: Cont

    1熱度

    1回答

    我想創建一個Scala宏&在字段的情況下將返回一個getter/setter對,並在方法的情況下部分應用函數。像下面這樣: trait ValRef[T] { def get(): T } trait VarRef[T] extends ValRef[T] { def set(x: T): Unit } // Example: case class Foo()

    1熱度

    1回答

    我使用宏註釋來檢查類的字段並基於這些字段添加成員。 例如 @AddVal class A(x: Int) 擴展到 class A(x: Int){ val get: Int = x } 提取ValDef後,它tpe領域仍然null所以要獲得類型我有兩個選擇: 1)如果我打電話的ToString的類型樹,我可以看到類型,但現在我已經失去了一些類型安全 2)如果我在類型樹上使用c

    3熱度

    1回答

    在我們的圖書館,我們有規定,像這樣的宏: def extractNamed[A]: Any = macro NamedExtractSyntax.extractNamedImpl[A] 本宏使用它的類型簽名來返回apply方法,其參數匹配其輸入,把案件類的apply方法。 的想法是,這使得我們的圖書館的用戶使用Scala的命名參數,像這樣: lazy val fruitExtractor =

    1熱度

    2回答

    假設我們的東西的模型,表示爲case class,因爲這樣 case class User(firstName:String,lastName:String,age:Int,planet:Option[Planet]) sealed abstract class Planet case object Earth extends Planet case object Mars extends

    4熱度

    2回答

    我有以下宏: package macros import scala.reflect.macros.blackbox.Context object CompileTimeAssertions { def mustBeCaseClass[T]: Unit = macro CompileTimeAssertionsImpl.mustBeCaseClass[T] } o

    1熱度

    1回答

    我用下面的斯卡拉宏(由this SO question代碼嚴重的啓發)獲得包含在一個給定的包,繼承一個特定性狀的所有對象的列表: object Macros { def allObjects[T <: AnyRef](packageName: String): List[Any] = macro allObjectsImpl[T] def allObjectsImpl[T <

    1熱度

    1回答

    假設我有一個元組 val myTuple: (String,Int,String,...,Boolean) = ("",0,"",..,true) 我可以寫一個類型別名 type MyType = (String,Int,String,...,Boolean) val myTuple: MyType = ("",0,"",..,true) 我可以動態寫這種類型的別名?有沒有一種方法在這種

    1熱度

    1回答

    假設我有類型A,B,和C,和一個重載的方法: def foo(a: A): C def foo(b: B): C 然後假設我有一個(複雜)的代碼與工作C類型的對象。我想有是採取兩種類型A或B的方法: def bar(x: [A or B]) = { val c = foo(x) // Code that works with c } 當然,我可以寫的bar兩個版本,