问题标签 [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 宏来内部化外部 DSL 吗?
我想使用宏在 Scala 中实现外部 DSL,例如 SQL。我已经看过有关如何使用 Scala实现内部 DSL的论文。另外,我最近自己写了一篇关于如何在 Java 中做到这一点的文章。
现在,内部 DSL 总是感觉有点笨拙,因为它们必须在宿主语言(例如 Scala)中实现和使用,并遵守宿主语言的语法约束。这就是为什么我希望 Scala 宏将允许在没有任何此类限制的情况下内部化外部 DSL。但是,我并不完全了解 Scala 宏以及我能用它们走多远。我已经看到SLICK和一个鲜为人知的名为sqltyped的库已经开始使用宏,但是 SLICK 使用“Scalaesque”语法进行查询,这不是真正的 SQL,而 sqltyped 使用宏来解析 SQL 字符串(可以也可以在没有宏的情况下完成)。此外,Scala 网站上给出的各种示例对于我正在尝试做的事情来说太微不足道了
我的问题是:
给定一个外部 DSL 示例,定义为一些 BNF 语法,如下所示:
我可以使用 Scala 宏实现上述语法以允许这样的客户端程序吗?还是 Scala 宏不够强大,无法实现这样的 DSL?
注意,我对解析字符串的解决方案不感兴趣,就像sqltyped那样
scala-2.10 - 获取具有更多层次深度的调用函数
以下代码获取调用函数(如 C _ _ FUNC _ _):
但是如何获得更多的深度,即获取调用宏的函数的函数的名称?
提前感谢您的帮助。
scala - 获取调用类
我想获取宏的调用类,但我的代码不起作用:
在此先感谢您的帮助。
scala - 传递给 Scala 宏的自省参数
我想编写一个将案例类的实例作为参数的 Scala 宏。可以传递给宏的所有对象都必须实现特定的标记特征。
以下片段显示了标记特征和实现它的两个示例案例类:
现在,我想使用宏编写以下代码,以避免运行时反射的繁重及其线程不安全:
该宏logDomain
在不同的项目中实现,类似于:
宏的目的应该是生成代码 - 在运行时 - 输出给定对象的所有值 (id
和) 并打印它们,如下所示:name
为此,我必须动态检查传递的类型参数并确定其成员(vals)。然后我必须生成一个代表创建日志输出的代码的 AST。无论将实现标记特征“域”的特定对象传递给宏,宏都应该工作。
在这一点上,我迷路了。如果有人能给我一个起点或指向我一些文档,我将不胜感激?我对 Scala 比较陌生,在 Scala API 文档或宏指南中没有找到解决方案。
scala - 在宏定义之外使用 reify
在宏定义内部,我可以使用c.reify
参数Context
将表达式转换为 AST。
但我希望能够通过传递 AST 并查看结果来测试我的宏函数。换句话说,给定:
我希望能够这样做以获取由特定表达式生成的 AST,因此我可以进行单元测试或只是在 REPL 进行非正式测试
但是c
那个表达式应该是什么?
scala - 从宏中获取具有匿名类方法的结构类型
假设我们要编写一个宏来定义一个具有一些类型成员或方法的匿名类,然后创建该类的一个实例,该类的静态类型为具有这些方法的结构类型,等等。这在 2.10 中的宏系统中是可能的。 0,并且类型成员部分非常容易:
(提供我的方法ReflectionUtils
的便利特性constructor
在哪里。)
这个宏允许我们将匿名类的类型成员的名称指定为字符串文字:
请注意,它的类型正确。我们可以确认一切都按预期工作:
现在假设我们尝试用一个方法做同样的事情:
但是当我们尝试它时,我们没有得到结构类型:
但是,如果我们在其中添加一个额外的匿名类:
有用:
这非常方便——例如,它可以让你做这样的事情——但我不明白它为什么有效,并且类型成员版本有效,但不是bar
. 我知道这可能不是定义的行为,但它有什么意义吗?有没有更简洁的方法从宏中获取结构类型(及其上的方法)?
scala - 如何生成静态成员并将其添加到类型宏中的类中?
我想将一个静态字段(bar
在此示例中命名Foo
)添加到具有类型宏(命名Static
)的类(命名)中。
这就是我目前正在尝试的方式:
宏
在编译期间,调用setFlag
似乎有效果,因为标志字符串发生了变化:
但在使用现场似乎根本没有实际效果:
show
也showRaw
不要显示任何迹象STATIC
。
我该如何解决这个问题?
scala - 如何用其他树替换子树?
在 Scala 宏中,我想做这样的事情:
我有一个Tree
(可能很大)。现在我想找到这棵树的一个具有某种具体形式的子树,例如Apply(_, _)
. 现在我想创建一个新树,它是原始树的副本,但是找到的子树被其他树替换。
有了这样的东西,我可以例如用调用一些其他方法来替换调用一些方法。
这样的事情可能吗?
scala - 将“项目”映射到其类型参数化“容器”的宏——大的编译器错误
假设我有“项目”的特征和这些项目的“容器”的另一个特征:
使用上面的类型信息,我想通过宏和一些运行时反射来构造一个这样的映射:
这是我的尝试,它编译得很好,并且以只返回 TypeTags 列表的中间形式工作:
但是,当我尝试通过调用它进行编译时,我得到一个巨大的编译器错误:https ://gist.github.com/4647812
任何人都可以发现问题,或提出更好的解决方法吗?
谢谢!
scala - 是否可以(重新)将接收器绑定到代码块中?
问题
这个问题的动机是试图为这个问题找到一个解决方案。
假设您想使用以下语法构建层次结构:
构造 DSL 应该是类型安全的,也就是说,不能将 asubB
直接嵌套在 中root
,或者将 a 嵌套subA
在另一个 中subA
。因此,我的想法是有一个方法root
返回一个定义方法的对象subA
,而后者又返回一个定义的对象subB
。
我现在想要的是传递给的代码块root
,即
被执行使得 的调用subB
被绑定到由 . 创建的对象root
。基本上是这样的
但不必使接收者r
和sa
明确的。
问题:this
在 Scala 中是否可以在代码块中重新绑定接收器,尤其是隐式接收器- 可能使用宏?
其他方法
本文描述了一个外观相似的 XML 树构造 DSL。它们的实现基于该Dynamic
特性,生成的 DSL 语法如下所示:
但是,这种方法需要显式的接收器(这里是 object xml
),更严重的是,我认为它不是类型安全的,因为它会静态地阻止您将html
节点嵌套在title
节点中。