Scala 宏检查树的匿名函数

2024-01-05

我刚刚开始使用宏,感觉我错过了一些非常明显的痛苦......

我想检查 AST 中是否有传递给我的宏的匿名 lambda 函数,最终我想对它做一些事情,但我在第一个障碍上就失败了。

我的代码如下所示;

object Test extends App {
  doIt(() => "bar")

  def doIt(f: () => String) = {
    Builder.build(f)
  }
}

object Builder {
  def build[R](func: () => R): String = macro builder_impl[R]

  def builder_impl[R](c: blackbox.Context)(func: c.Expr[() => R]): c.Expr[String] = {
    import c.universe._

    println(showRaw(func))

    reify {
      println("hello yeah")
      "foo"
    }
  }
}

我期待 showRaw 打印类似的内容;

Expr(Function(List(), Literal(Constant("bar"))))

然而,我得到的是;

Expr(Ident(TermName("f")))

我可以通过在 Builder.build 的调用站点定义匿名函数来获得我想要的东西;

Builder.build(() => "bar")

然而,这并不能帮助我做我需要做的事情。

有人可以解释一下我的误解吗?我怎样才能实现我的目标?

另外,有一些很棒的 Scala 宏食谱值得我阅读吗?

Regards,

Ryan.


你只能得到传递给宏的 AST(在这种情况下,唯一涉及的宏是build,然后你用参数来称呼它f,这样你就得到了 ASTf)。所以如果你想得到 AST() => "bar" in doIt(() => "bar"), doIt本身必须是一个宏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 宏检查树的匿名函数 的相关文章

随机推荐

  • GSON解析未指定类型变量

    我使用 GSON 库解析服务器 JSON 响应 后端人员有时会告诉我 出于某种原因 我们无法在 JSON 中指定变量类型 旧的 php 他们不知道如何做到这一点等等 GSON 喜欢在其对象模型中使用强类型 所以我无法将对象解析为字符串 GS
  • 有没有办法让 puppeteer 的 waitUntil “networkidle” 只考虑 XHR (ajax)请求?

    我正在使用 puppeteer 来评估我的测试应用程序中基于 javascript 的网页 HTML 这是我用来确保加载所有数据的行 await page setRequestInterception true page on reques
  • RecyclerView LinearLayoutManager 设置项目计数

    在 GridLayoutManager 中 我可以设置跨度计数 这使得视图内的项目调整大小以能够水平适应该跨度计数 我有一个 LinearLayoutManager 我想以同样的方式使用它 有固定数量的可见项目并调整它们的大小以适应 我在同
  • 如何在Windows中使用RMySQL?

    我尝试使用 RMySQL 包 但出现此错误 install packages RMySQL Warning in install packages package RMySQL is not available for R version
  • 只允许用户投票一次。姜戈

    我有什么models py class Poll models Model question models CharField max length 200 pub date models DateTimeField date publis
  • 将字符串数组从 C# 返回到 Inno Setup

    我在用着非托管导出 NuGet https www nuget org packages UnmanagedExports来自 Robert Giesecke 并在 C 中有以下方法 DllExport DummyMethod Callin
  • Go中函数名之前的参数? [复制]

    这个问题在这里已经有答案了 我见过一些像这样定义的 Go 函数 type poly struct coeffs 256 uint16 func p poly reset for i range p coeffs p coeffs i 0 您
  • readString 仅当 CurrentBSONType 为 STRING 时才能调用,而当 CurrentBSONType 为 OBJECT_ID 时则不能调用

    我收到以下错误 在读取 POJO 时 我能够成功插入 更新和删除 我们正在使用 mongodb driver reactivestreams 1 9 0 org bson codecs configuration CodecConfigur
  • 致命错误:找不到“stdafx.h”文件

    我是 C 编程新手 正在尝试通过网站 learncpp com 自学 尽管我已经坚持编译我的第一个程序 他们使用 Visual Studio 来编程他们的代码 因为我使用的是 macbook 我只是使用 vi 和终端 或者我应该使用其他东西
  • vim:同步多个主机上所有插件的最佳实践是什么

    我正在尝试开始使用 vim 插件管理工具来管理我的 vim 插件 例如 vundle 并且我有多个主机并希望它们与 vim 设置同步 目前我正在将 vim 目录检查到 git 存储库中 但我不想签入所有插件 因为它们属于其他插件 想知道如果
  • asp.net 将字符串变量传递给用户控件

    我正在尝试将代码隐藏变量的值传递给用户控件 例如
  • Python 中的整数是按值传递还是按引用传递?

    我编写了以下代码来检查整数是否按值或引用传递 foo 1 def f bar print id foo id bar bar 1 print foo bar f foo 我得到的输出是 True 1 2 从Python文档来看 id obj
  • 我如何主题滚动 jGrowl

    我正在构建一个网站 并且尝试使用 jquery ui 主题来实现尽可能多的样式 jGrowl 网站称它可以进行主题滚动 从网站 1 2 2 的变化 通知现在可以为 jQuery UI 进行主题滚动 特别感谢 Jeff Chan 确实没有任何
  • 使用远程 gdbserver 启动 ddd

    我正在使用 ddd 调试在远程目标上运行的程序 例如 远程 gdbserver 通过端口 1234 在本地主机上运行 但仍充当远程 我知道你可以通过打开 ddd 连接到 gdbserver 然后调用target remote localho
  • 使用未解析的标识符“GGLContext”

    我正在将 Google Sign In 集成到我的 ios Swift 应用程序中 我按照谷歌开发者页面上的官方说明进行操作 https developers google com identity sign in ios sign in
  • 创建状态项 - 图标显示,菜单不显示

    在基于文档的项目中 我试图创建一个状态菜单 我有一个构建状态栏的单例类 并且我从应用程序委托启动它 如您所见 当我运行它时 我没有收到任何错误 但只有状态栏的图像 但没有下拉菜单 我在 IB 中创建了菜单 我搞砸了什么 Delegate i
  • 使用 Swift 计算 SpriteKit 中的 delta

    我正在尝试通过重构我的一款旧游戏来快速学习 我需要重写我的update计算增量时间的方法 这段代码works但很丑 我该怎么办properly重写这个 import SpriteKit class GameScene SKScene var
  • Flot:如何在条形图中设置数字样式?

    我在用着流程图 http www flotcharts org 它是插件Flot barnumbers Demo http joetsoi github io flot barnumbers 显示图表 我需要在栏中显示数字 它可以工作 不幸
  • FPDF 在每个 A4 尺寸页面的页脚处获取页码

    我正在使用 FPDF 创建 PDF 报告 现在 如何在页面底部的报告的每一页上生成页码 以下是生成 2 页 PDF 的示例代码
  • Scala 宏检查树的匿名函数

    我刚刚开始使用宏 感觉我错过了一些非常明显的痛苦 我想检查 AST 中是否有传递给我的宏的匿名 lambda 函数 最终我想对它做一些事情 但我在第一个障碍上就失败了 我的代码如下所示 object Test extends App doI