问题标签 [scala-macros]
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 - 在 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 之外执行转发标签应用?(也许这是一个多余的问题)
当然,答案中的任何宏实现示例都非常受欢迎!
干杯,
scala - 用宏隐藏闭包样板?
给定一个示例闭包,在这种情况下,它返回字符串中的单词数(带有附加的任意运算符)。
有没有办法可以隐藏一些样板,以便我可以编写:
macros - 是否可以编写一个返回类型取决于参数的 scala 宏?
对于 DSL,我希望能够执行以下操作:
我的问题是将Any
in reify 替换为将返回正确参数化版本的内容。
(上面我使用了一个字符串参数,但在最终版本中,我计划使用类 T 的伴随对象作为标记来了解 Function1[T,Unit] 的参数类型)
scala - Scala:路径相关类型的等价性
我如何解决两个我知道是相同但编译器不一样的路径相关类型的等价?
使用 Scala 2.10.0 M7 我正在尝试将 AST 从一个宇宙转换为另一个。
在宏实现中,我可以将其用作:
但是,这会导致编译器错误:
上面代码c
中的值显然与 相同bridge.context
,但可能是因为它是一个值类型检查器,无法检查它。放置广义类型约束没有帮助:
在宏中,这仍然导致错误:
我需要访问权限,context.universe
以便可以访问其他依赖类型,例如TermName
. 除了铸造之外还有更好的解决方法吗?
scala - 如何引用在 Scala 宏中包含“this”?
以下宏是从一个更大的示例中提取的,它应该创建一个只有对 的引用的树this
:
但是调用echoThis
诸如
编译失败,提示信息
如果我设置-Ymacro-debug-lite标志,生成的树是This(newTermName("<local Testing>"))
.
scala - 宏、拼接和模式匹配
有没有办法在模式匹配中使用宏的参数?我想这样做:
但不幸的是,编译器说“需要稳定的标识符,但找到了 X.splice”。通常,可以通过首先分配一个 val 来解决这个问题,例如:
但当然,这也不适用于拼接。
scala - 在Scala中将方法提取到独立函数
给定类似的东西:
如何(自动)提取函数:
使用这个确切的类型签名(首先是对象,然后是参数列表)。让我非常清楚地说明问题:
“给定一个
f(x1: X1, ..., xn: Xn)
在类的上下文中定义的方法A
,如何自动提取一个函数f'
,该函数(i) 接收类型的实例,以及a
A
(ii)与 1:1 的参数列表对应的参数列表,f
即x1: X, ... xn: Xn
实施正是a.f(x1: X1, ..., xn: Xn)
“
甚至:
捕获 lambda 演算的可扩展性概念, 这样您就可以自动
λx.(f x)
从.f
x
f
这可以首先通过找到一种访问标识符的方法来解决f
,g
... 我们可以简单地书写或手写,但让我们沉迷于干燥。a: A
A
f'
g'
PS 也许如果没有运行时反射,这是不可能的(尽管使用 Scala 2.10+ 宏可能是可能的),因为我似乎无法找到一种方法来事先引用f
或g
不引用特定实例 ( a: A
) 的标识符。但这将类似于以下内容,而不必求助于strings
:
我也意识到这个问题的实际用途可能会帮助参与者提出替代方案,但我是在抽象意义上讨论这个问题。我不是试图解决我已经简化为这个问题的其他问题。我想知道这是否可能:-) 这是一篇非常好的文章,可以真正理解这个问题背后的动机,并对 Scala 上的 Eta 扩展进行了咆哮。
scala - Scala:无样板的拉皮条
我广泛使用Pimp my Library模式,我想删除样板。例如,假设我有一些特质 PrettyPrint:
如果我想拉皮条 Int 和 Double,我需要编写如下代码:
在上面,我将其归类为样板:1)隐式转换的名称,2)“new”关键字,3)也许是参数名称“self”,4)也许是“implicit”关键字。我宁愿写这样的东西:
在上述代码的右侧,名称“self”被假定为转换参数。
关于如何做到这一点的想法?
一些注意事项:
1) 如有必要,我愿意使用 Scala 2.10。
2)据我所知,Scala 2.10 中的新隐式类还不够。这是因为每个隐式类只有一个隐式转换。换句话说,像下面这样的代码不会编译,因为 PrettyPrint 被声明了两次:
scala - 宏是否可以在 Scala 中进行自然链接比较?
Scala 不像 Python 那样提供链式比较:
具有新宏功能的 Scala 2.10 是否会让程序员编写一个添加此功能的库?或者这超出了Scala 宏的范围?
宏似乎是实现此类语法糖的正确选择,因为它们不会使解析器/编译器复杂化。