在 scala 宏中使用 LabelDef (2.10)

2024-05-19

我正在尝试 scala 2.10 宏功能。我使用时遇到问题LabelDef但在某些情况下。在某种程度上,我偷看了编译器的代码,阅读了摘录米格尔·加西亚的论文 http://lampwww.epfl.ch/~magarcia但我还是卡住了。

如果我的理解是正确的,伪定义是:
LabelDef(labelName, listOfParameters, stmsAndApply)其中 3 个参数是 Trees 并且:
- labelName是标签的标识符$L被定义
- listOfParameters对应于 label- 时传递的参数apply发生,如$L(a1,...,an),并且可以为空
- stmsAndApply对应的块声明(可能没有)和最终的apply-表达
label-apply 或多或少意味着 GOTO 到标签

例如,在简单循环的情况下,LabelDef 最终可以apply itself:
LabelDef($L, (), {...; $L()})

现在,如果我想定义 2 个互相跳转的 LabelDef:

...
LabelDef($L1, (), $L2())
...
LabelDef($L2, (), $L1())
...

第2个LabelDef没问题,但第1个编译器输出错误,“未找到:值$L2”。我想那是因为$L2在尝试应用它时尚未定义。这是一棵正在建造的树,因此对我来说是有意义的。到目前为止我的理解正确吗?因为如果预计不会出现错误,则意味着我的宏实现可能有错误。

无论如何,我相信有must是从 $L1 应用 $L2 (即跳转到 $L2)的一种方式,somehow,但我只是不知道该怎么做。有人有这样做的例子,或者有任何指示吗?


关于在宏中使用 LabelDef 的其他不清楚的地方(但现在不太关心)是:
-第二个参数是什么,具体来说,非空时如何使用?换句话说,带参数的标签应用机制是什么?
- 在第三个参数的最终表达式中放入除标签应用之外的任何内容是否有效? (并不是说我不能尝试,但宏仍然处于实验阶段)
- 是否可以在 LabelDef 之外执行转发标签应用? (也许这是一个多余的问题)

当然,非常欢迎答案中的任何宏实现示例!
Cheers,


因为如果预计不会出现错误,则意味着我的宏实现可能有错误。
是的,这似乎是一个错误(^^;虽然我不确定 Block/LabelDef 组合的限制是否是故意存在的。

def EVIL_LABELS_MACRO = macro EVIL_LABELS_MACRO_impl
def EVIL_LABELS_MACRO_impl(c:Context):c.Expr[Unit] = { // fails to expand
  import c.universe._
  val lt1 = newTermName("$L1"); val lt2 = newTermName("$L2")
  val ld1 = LabelDef(lt1, Nil, Block(c.reify{println("$L1")}.tree, Apply(Ident(lt2), Nil)))
  val ld2 = LabelDef(lt2, Nil, Block(c.reify{println("$L2")}.tree, Apply(Ident(lt1), Nil)))
  c.Expr( Block(ld1, c.reify{println("ignored")}.tree, ld2) )
}

def FINE_LABELS_MACRO = macro FINE_LABELS_MACRO_impl
def FINE_LABELS_MACRO_impl(c:Context):c.Expr[Unit] = { // The End isn't near
  import c.universe._
  val lt1 = newTermName("$L1"); val lt2 = newTermName("$L2")
  val ld1 = LabelDef(lt1, Nil, Block(c.reify{println("$L1")}.tree, Apply(Ident(lt2), Nil)))
  val ld2 = LabelDef(lt2, Nil, Block(c.reify{println("$L2")}.tree, Apply(Ident(lt1), Nil)))
  c.Expr( Block(ld1, c.reify{println("ignored")}.tree, ld2, c.reify{println("The End")}.tree) )
}

我认为一个块被解析为{ 陈述;表达 }因此最后一个参数是表达。如果 LabelDef“陷入”表达,例如EVIL_LABELS_MACRO 模式,其扩展在以下位置不可见声明;因此错误“未找到:值$L2".

所以最好确保所有 LabelDef “落入”声明。 FINE_LABELS_MACRO 执行此操作并扩展为:

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

在 scala 宏中使用 LabelDef (2.10) 的相关文章

随机推荐

  • JavaScript 的事件常量?

    在 Javascript 中我有这样的代码 document addEventListener mousedown mouseDownHandler 有时我可能会发胖手指 document addEventListener mouzedow
  • 获取今天的科普特日期

    我正在寻找获取今天的科普特日期与任何代码类型类似php or javascript在我的网站标题中显示科普特日期 我需要阿拉伯语或英语版本 我试图找到它 但没有找到类似的英文内容 参考 http www copticchurch net e
  • Logcat不断显示消息

    我不知道出了什么问题 我的 logcat 已经困扰我两天了 当设备连接到测试时 尽管我不运行我的应用程序 但 logcat 会不断发出消息 如果我运行我的应用程序 我无法在如此大量的数据中找到我的应用程序日志 有人可以建议我避免这种情况 以
  • 如何从 Artifactory 存储库下载最新的工件?

    我需要来自存储库的最新工件 例如快照 人工工厂 http en wikipedia org wiki Software repository Repository managers 该工件需要通过脚本复制到服务器 Linux 我有什么选择
  • 如何在 Android 中以编程方式选择或突出显示 TextView?

    目前 我正在创建一个用于阅读的小应用程序 有一个文本视图来显示文本 我们可以为文本添加书签并存储在列表视图中 我想从列表视图中单击 它会突出显示或选择文本视图中的书签索引 我可以得到bookmark index 有没有类似的方法textvi
  • 连接到 OpenShift (Redhat Paas) mysql 实例

    我正在尝试将我的 C 应用程序与 openshift 数据库连接 但我得到了这个例外conn Open Eccezione gt MySql Data MySqlClient MySqlException 0x80004005 Unable
  • 优化 python for 循环

    下面是两个简单计算 一种是Python 另一种是Java public class prime public static void main String args int n Integer parseInt args 0 int np
  • 如何更改codeception phpbrowser/mink超时

    我正在尝试使用代码接收创建测试 以检查页面在高负载的情况下是否正常工作 不幸的是 如果页面负载非常高并且测试开始 我会收到这样的错误 Codeception Exception ModuleConfig Codeception Util M
  • CPU 周期与总 CPU 时间

    在 Windows 上 GetProcessTimes 和 QueryProcessCycleTime 可用于获取应用程序所有线程的总计 我期望 显然是天真地 找到总周期数和总处理器时间 用户 内核 之间的比例关系 当转换为相同的单位 秒
  • C++从文件中读取整数并保存到数组中

    我正在制作一个仅从文本文件读取整数的程序 我想创建一个读取整数并将它们存储在数组中的函数 以便稍后可以使用该数组通过冒泡排序对它们进行排序 这是我到目前为止所得到的 但我得到的输出是一些随机的 803234 数字 void read int
  • 如何处理最终字符串?

    制作有什么好处吗String as final或者我们可以做String as final 我的理解是 由于 String 是不可变的 因此没有必要将其设为最终的 这是正确的还是人们想要的情况String as Final Code pri
  • 什么时候使用Task,什么时候使用Thread?

    我刚刚问了有关任务的问题 但意识到我实际上想问更一般的问题 有人可以总结一下任务和线程的优缺点吗 如何理解应该使用任务还是线程 Task是一个以异步方式编程执行某些操作的命令 这Thread实际上是OS内核对象executes要求什么 想一
  • 如何更改 LongListMultiSelector 中的 CheckBox 和 CheckBox 勾号的颜色? WP8

    是否可以更改 LongListMultiSelector 中的复选框和复选框勾选的颜色 我已经尝试过乔治 尼古拉德斯的解决方案 但我无法达到我所需要的 还有其他方法可以做到这一点吗 请问有人可以更详细地解释一下吗 如果它是可能的 提前致谢
  • 无法使用 OpenSSL 验证服务器证书

    我已经使用 OpenSSL 编写了一个 SOAP 客户端 在 Ubuntu 12 04 上用 C 编写 但它目前无需检查服务器安全证书即可运行 这是我用来设置连接和检查证书的函数 bool bInitialiseSSL SSL CTX ct
  • 无法找到任何实现 Connector 且名称与 io.debezium.connector.mysql.MySqlConnector 匹配的类,可用的连接器有

    使用 Kafka MySQL 和 Debezium 设置数据流管道 我是这个版本的 Kafka 3 4 0 MySQL 8 Debezium 2 2 1 Java 11 目标 我想从 MySQL 捕获所有 CDC 并将数据流式传输到 Kaf
  • Doctrine make:迁移未知数据库类型

    我正在尝试开始使用 Doctrine 但是在通过创建实体时遇到了问题php bin console make entity 然后我尝试进行迁移php bin console make migration但我收到此错误消息 请求未知的数据库类
  • CGPoint 标量乘法 Swift

    我正在 SpriteKit 中构建一个平台游戏 并将为我的实体实现更新功能 以便它们根据重力和速度移动 但是 我需要使添加的速度量与增量时间成比例 以防止帧速率影响我的实体的移动方式 因此我将导入 GLKit 以便我可以使用标量函数 但是
  • C++中有没有办法让派生类重写基类静态方法?

    我有一个多次派生的基类 B D1 D2 等 在类 B 中 我希望有一个静态方法 getInfo 它返回一个 BaseInfo 类 基本上是一个包含类 B 的默认成员值的类 因此将其设为静态是有意义的 因为不需要特定的实例 现在 有没有办法强
  • 是否可以在 PyScript 中使用 OpenCV 模块?

    我想使用 opencv 模块 但无法导入 OpenCV 那么我该如何解决这个问题呢 顺便说一句 Pyodide 支持 OpenCV 示例代码 https i stack imgur com ahwex jpg 尚不支持 OpenCV 此时O
  • 在 scala 宏中使用 LabelDef (2.10)

    我正在尝试 scala 2 10 宏功能 我使用时遇到问题LabelDef但在某些情况下 在某种程度上 我偷看了编译器的代码 阅读了摘录米格尔 加西亚的论文 http lampwww epfl ch magarcia但我还是卡住了 如果我的