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

Scala宏,他们在哪里使用?

发布时间:2020-12-16 09:12:35 所属栏目:安全 来源:网络整理
导读:我只是注意到 Scala有宏,但是我从来没有看过任何使用它们的代码.它们也似乎与C预处理器宏等不同.阅读通过 overview的宏,它看起来并不像他们提供以前在Scala以前不可能的任何东西.在动机标题下,有一些宏可以启用的东西: Language virtualization (overloadin
我只是注意到 Scala有宏,但是我从来没有看过任何使用它们的代码.它们也似乎与C预处理器宏等不同.阅读通过 overview的宏,它看起来并不像他们提供以前在Scala以前不可能的任何东西.在动机标题下,有一些宏可以启用的东西:

  • Language virtualization (overloading/overriding semantics of the
    original programming language to enable deep embedding of DSLs),
  • Program reification (providing programs with means to inspect their
    own code),
  • Self-optimization (self-application of domain-specific
    optimizations based on program reification),
  • Algorithmic program
    construction (generation of code that is tedious to write with the
    abstractions supported by a programming language).

稍后在菜单中,有实验性的宏功能,如宏类型,quasiquotes,无类型的宏等等.显然有这个需求!

所有这些似乎都是为建立非常复杂的图书馆,对Scala有很强的了解的人们的好功能.但是,宏会为平均Scala开发人员提供一些东西吗?使用宏会使我的Scala代码更好吗?

解决方法

作为“平均”Scala开发人员,您很可能不会自己编写宏,除非您有非常好的理由.

宏是一种编译时间元编程的方法,也就是说你编程程序.例如,作为Scala 2.10的一部分的def宏(尽管仍然是“实验性”)看起来像一个常规的方法,但是只要您在代码中调用该方法,编译器将用该方法后隐藏的任何宏替换该调用将产生(一个新的代码片段).

一个很简单的例子.将您的项目编译到代码中的日期:

import java.util.Date
import reflect.macros.Context
import language.experimental.macros

object CompileTime {
  def apply(): Date = macro applyImpl

  def applyImpl(c: Context)(): c.Expr[Date] = {
    import c.universe._
    val now     = System.currentTimeMillis() // this is executed during compilation!
    val nowExpr = c.Expr[Long](Literal(Constant(now)))
    val code    = reify(new Date(nowExpr.splice))
    c.Expr(code.tree)
  }
}

使用该宏(以下代码必须与上述宏代码分开编译):

object MacroTest extends App {
  println(s"This project was compiled on ${CompileTime()}")
}

(如果你多次运行,你会看到编译时间确实是恒定的)

所以简而言之,宏提供了以前没有的任何Scala版本的功能.你可以用宏做的事情,你不能用其他方式(通常你可以使用运行时反射来编写类似的东西,但在编译时检查宏).

然而,作为一个用户,您将会越来越多地了解到包含宏的库,因为它们可以提供完全类型安全的强大的构造.例如,可以使用宏来自case的自动序列化程序,因为宏可以检查您的案例类的类型并构建正确的程序结构(AST)来读取和写入该案例类,而不会有运行时的危险失败.

一些随机链接

> https://github.com/retronym/macrocosm
> http://www.warski.org/blog/2012/12/starting-with-scala-macros-a-short-tutorial/

(编辑:李大同)

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

    推荐文章
      热点阅读