问题标签 [scala-2.10]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - 嵌套宏调用是否安全?
我一直在测试一些嵌套的宏调用,它们按预期工作(......正如我所料!)例如,假设一个虚构的add宏和以下表达式:
首先,内部 add 被扩展 (2 + 3),其次外部 add 完成它的部分 (1 + (2 + 3))。我已经看到外部宏在输入表达式中没有收到来自内部调用的任何噪音,因此内部扩展似乎对它完全透明。这个事实是否总是成立(即使是更复杂的宏和类型)?这样做安全吗?
scala - 更新不可变 AST 的最简单方法是什么?
在使用宏时,我已经到了需要更新 AST 中保持特定条件的那些节点的地步(我一直在努力避免它)。例如,假设我想更新每个节点:
价值:
这些 AST 节点可能位于表达式树中的任何位置,因此我不能使用 ad-hoc 模式匹配器。显然,我想做的最后一件事是编写一个能够覆盖所有编译器原语的完整模式匹配器。我一直在API中搜索,但我的印象是collect和traversable family 之类的方法不足以满足我的需求,因为它们将树视为线性事物,因此我想要整个更新的树. 那么,是否有可能以一种智能的方式更新不可变的表达式树?为什么标准 API 中不存在这样的“更新”操作?
android - 如何在 SBT/Android 插件/项目中更改 Scala 版本?
我正在使用带有 jberkel/android-plugin 的 SBT v0.13,我正在尝试对其进行修改。
为此,我需要在我的测试项目中 使用Scala 2.10.0-20120710-144914-026a70d555 。
到目前为止,我使用的是Scala 2.9.1,现在需要切换到2.10.0-20120710-144914-026a70d555,但是我对这些东西不是很熟练。
我遇到了这个问题,但这对我不起作用。
当我尝试编译测试应用程序并将其推送到设备时,我得到以下输出:
scala - 是否可以使用 SBT 的反射?
我正在尝试使用 SBT(对我来说是全新的工具)生成一些样板文件。我使用无形的 sbt 文件作为任务的主要参考。我已经看到这个项目从头开始使用代码生成,但我的情况略有不同,因为我想从另一个类生成一些类。我假装使用新的 Scala 2.10.0-M4 反射功能来这样做。需要什么基本配置才能从 SBT 构建中获得反射?
到目前为止,sbt 无法找到scala.reflect.runtime.universe包,我不知道问题是来自新的 Scala jar 部门还是来自错误的配置。此外,我的 sbt about说:
顺便问一下,有人知道使用 SBT 生成源代码的其他项目吗?
scala - 反射可以提取特征中使用的初始值吗?
我正在玩反思,以对一个特征进行深入分析。我想得到的一件事是设置为成员字段的初始值。例如,在特征中:
很高兴知道 3 和“y”。我在 API 中没有找到与此任务相关的任何内容,并且由于以下输出(由 scalac -Xprint 生成):
恐怕很难访问它们,因为它们保存在 $init$ 方法的主体中。有没有(简单的)方法可以通过反射获得这些值?
scala - 宏:依赖路径的类型推断混淆
我试图简化 AST 的创建,但收到一条奇怪的错误消息:
错误:
是否可以将正确的类型推断到类中meth
?或者是否有解决该问题的方法?
编辑:基于@retronyms 的回答,我得到了这个工作:
scala - 如何知道一个对象是否是 TypeTag 类型的实例?
我有一个函数,它能够知道一个对象是否是 aManifest
类型的实例。我想将它迁移到一个TypeTag
版本。旧功能如下:
我一直在尝试使用 TypeTag,现在我有了这个 TypeTag 版本:
有没有更好的方法来完成这项任务?U
是否可以使用 an 来省略参数化Any
(就像在旧函数中所做的那样)?
scala - 反射:显示静态类型的字节码类型签名
是否可以使用新的反射库显示保存在字节码中的完整类型签名(带有已擦除的参数化类型)?
例如类型
应显示为
因为这是存储在字节码中的类型。可以用 显示这种类型javap
。第一个需要编译一些代码scalac
:
命令javap -c -s -l -verbose X$
显示:
的输出javap
有点奇怪,我更感兴趣的是获得“类似 Java”的输出。也许一个代表类型签名的字符串是一个更好的类型,可以很容易地生成这个字符串。
另一个例子:
是否已经支持这样的东西,如果没有,如何为任何类型构建这样的输出?
scala - 如何在 Scala 中打印扩展宏?
我正在用 Scala 编写一个宏,但是当我调用它时,我收到一条错误消息,上面写着“Double 不接受参数”。很明显,宏构建 AST 的方式有问题。那么我怎样才能看到扩展的宏呢?有没有办法在运行时调用宏实现?
scala - 在 Scala 宏中使用 LabelDef (2.10)
我正在尝试使用 scala 2.10 宏功能。不过,在某些情况下,我无法使用LabelDef 。在某种程度上,我偷看了编译器的代码,阅读了Miguel Garcia 的论文节选,但我仍然卡住了。
如果我的理解是正确的,伪定义将是:
LabelDef(labelName, listOfParameters, stmsAndApply)
其中 3 个参数是 Trees,并且:
-是正在定义labelName
的标签$L
的标识符
-对应于标签应用listOfParameters
发生时传递的参数,如$L(a1 ,...,an),并且可以为空
-对应于语句块(可能没有)和最终的apply -expression
label-apply 意味着或多或少的 GOTO 到标签stmsAndApply
例如,在简单循环的情况下,LabelDef 最终可以应用自己:
LabelDef($L, (), {...; $L()})
现在,如果我想定义 2 个相互跳转的 LabelDef:
第二个 LabelDef 很好,但是编译器在第一个输出错误,“未找到:值$L2 ”。我猜这是因为$L2在尝试应用它时尚未定义。这是一棵正在建造的树,因此对我来说很有意义。到目前为止我的理解正确吗?因为如果没有预期的错误,这意味着我的宏实现可能是错误的。
无论如何,我相信一定有一种方法可以以某种方式从 $L1 应用 $L2(即跳转到 $L2),但我不知道该怎么做。有人有这样做的例子或任何指针吗?
关于在宏中使用 LabelDef 的其他不清楚的点(但现在不太关心)是: -
第二个参数是什么,具体来说,它在非空时如何使用?换句话说,带有参数的标签应用机制是什么?
- 将第三个参数的最终表达式放入标签应用之外是否有效?(并不是说我不能尝试,但宏仍然是实验性的)
- 是否可以在 LabelDef 之外执行转发标签应用?(也许这是一个多余的问题)
当然,答案中的任何宏实现示例都非常受欢迎!
干杯,