加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

记录Scala 2.10宏

发布时间:2020-12-16 09:29:20 所属栏目:安全 来源:网络整理
导读:我将从一个例子开始.这里是一个等效的List.fill for tuples作为Scala 2.10中的一个宏: import scala.language.experimental.macrosimport scala.reflect.macros.Contextobject TupleExample { def fill[A](arity: Int)(a: A): Product = macro fill_impl[A]
我将从一个例子开始.这里是一个等效的List.fill for tuples作为Scala 2.10中的一个宏:

import scala.language.experimental.macros
import scala.reflect.macros.Context

object TupleExample {
  def fill[A](arity: Int)(a: A): Product = macro fill_impl[A]

  def fill_impl[A](c: Context)(arity: c.Expr[Int])(a: c.Expr[A]) = {
    import c.universe._

    arity.tree match {
      case Literal(Constant(n: Int)) if n < 23 => c.Expr(
        Apply(
          Select(Ident("Tuple" + n.toString),"apply"),List.fill(n)(a.tree)
        )
      )
      case _ => c.abort(
        c.enclosingPosition,"Desired arity must be a compile-time constant less than 23!"
      )
    }
  }
}

我们可以使用这个方法如下:

scala> TupleExample.fill(3)("hello")
res0: (String,String,String) = (hello,hello,hello)

这个家伙在几个方面都是一只奇怪的小鸟.首先,arity参数必须是一个文字整数,因为我们需要在编译时使用它.在Scala的早期版本中,我甚至没有办法(据我所知)方法甚至告诉它的一个参数是否是编译时文字.

其次,Product返回类型is a lie-静态返回类型将包括由参数确定的特定arity和元素类型,如上所示.

那么我该如何记录这件事呢?我现在不期待Scaladoc的支持,但是我希望有一种常规或最佳实践的感觉(除了确保编译时错误消息是清楚的),这将使运行到宏方法 – 使用它对于Scala 2.10库的用户来说,可能是奇怪的需求 – 不那么令人惊讶.

新宏观系统的最成熟的演示(例如,ScalaMock,Slick,其他列出的here)在方法层面仍然相对没有记录.可以理解任何示例或指针,包括具有类似宏系统的其他语言的示例或指针.

解决方法

我认为记录这些的最好方法是使用示例代码,因为Miles已经在他的实验性 macro based branch中进行了无形.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读