gpt4 book ai didi

Scala 宏,它们在哪里使用?

转载 作者:行者123 更新时间:2023-12-03 23:26:30 25 4
gpt4 key购买 nike

我只是注意到 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).


稍后在菜单中,有实验性的宏功能,例如类型宏、准引用、无类型宏等等。显然有这样的需求!

对于那些构建非常复杂的库并且对 Scala 有深入了解的人来说,所有这些似乎都是不错的功能。但是宏是否也为普通 Scala 开发人员提供了一些东西?使用宏会让我的 Scala 代码更好吗?

最佳答案

作为“普通的”Scala 开发人员,您很可能不会自己编写宏,除非您有充分的理由。

宏是编译时元编程的一种方法,也就是说您可以编写程序。例如,一个 def-macro——它是 Scala 2.10 的一部分,尽管仍然是“实验性的”——看起来像一个常规方法,但是每当你在代码中调用该方法时,编译器都会用隐藏在该方法后面的宏替换该调用将产生(一个新的代码片段)。

一个非常简单的例子。将您的项目编译到代码中的日期合并:

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 版本都没有的功能。你可以用宏做一些你不能做的事情(通常你可以使用运行时反射来编写类似的东西,但在编译时检查宏)。

然而,作为用户,您将越来越多地接触到包含宏的库,因为它们可以提供完全类型安全的强大结构。例如,可以使用宏来实现来自案例类的 JSON 的自动序列化器,因为宏可以检查案例类的类型并构建正确的程序结构 (AST) 来读写该案例类,而没有运行时的危险失败。

一些随机链接
  • https://github.com/retronym/macrocosm
  • http://www.warski.org/blog/2012/12/starting-with-scala-macros-a-short-tutorial/
  • 关于Scala 宏,它们在哪里使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17409411/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com