问题标签 [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 - 编写模式匹配宏
我需要一些帮助来编写一个产生模式匹配的宏。
据我所知:
这是一个例子:
当前的错误是:
(注意这play.api.libs.json
是我的包裹,所以这是正确的)。我不知道该怎么做这个错误......
展开的宏应如下所示
在我看来,它可能看起来像case x: Class[Bar] => ???
现在。所以我的猜测是我需要使用reifyType
而不是reifyRuntimeClass
. 基本上,我如何从 a 中获取树Type
?
scala - Scala 宏:用 Scala 中的类的字段制作地图
假设我有很多类似的数据类。这是一个示例类User
,定义如下:
我有兴趣自动创建一个方法(在编译时),该方法返回一个Map
在运行时调用时每个字段名称都映射到其值的方式。对于上面的示例,假设我的方法被调用toMap
:
应该返回
你会如何用宏来做到这一点?
这是我所做的:首先,我Model
为我的所有数据类创建了一个类作为超类,并在其中实现了这样的方法:
然后我在一个单独的Macros
对象中定义了一个宏实现:
然而,当我尝试编译它时,我从 sbt 得到这个错误:
Macros.scala 首先被编译。这是我的 Build.scala 的片段:
我究竟做错了什么?我认为编译器在创建表达式时也会尝试评估字段标识符,但我不知道如何在表达式中正确返回它们。你能告诉我怎么做吗?
首先十分感谢。
scala - 编译时的scala宏错误
我想使用 scala 宏进行实验。但是当我使用宏时出现错误。
错误:
为什么?
scala - 对定义宏的对象成员的宏访问
假设我有一个Foo
用初始值实例化的特征i
我后来打电话给一个secondMethod
反过来打电话myMacro
那么,怎样才能找到(6)myMacro
的初值呢?i
我没有成功使用 等进行正常编译反射c.prefix
,c.eval(...)
而是找到了一个 2-project 解决方案:
项目B:
项目 A(取决于项目 B):
我们可以使用普通实例化或使用宏之类的来创建Foo
并设置值。第二种方法允许我们在第一次编译时在编译时自定义一个,然后在第二次编译中进一步自定义它对输入的响应(在这种情况下)!在某种程度上,我们获得了“元元”能力(或“超形上学”能力;-)i
makeFoo
Foo
i
通常我们需要 foo 在范围内进行内省i
(例如 c.eval(...))。但是通过将i
值保存在Foo
对象中,我们可以随时访问它,并且可以Foo
在任何地方实例化:
我的问题
i
如果没有这个双重编译黑客,我可以在我的示例宏中找到吗?
overloading - Scala 宏:方法重载
我有一个转换器函数,它从 JSON 创建一个案例类对象,其定义如下:
我也有兴趣从包含 JSON 的字符串创建相同的对象。所以我通过更改上面的代码片段重载了原始方法,如下所示:
但我收到此错误消息:
所以对于下面的配置
宏尝试返回以下表达式:
第一个是正确的,而第二个尝试访问 T 。
宏基本实现如下:
是否可以在不制作另一个宏的情况下实现我想要的?
首先十分感谢!
scala - Scala getter/setter 作为宏
我无法将 setter 和 getter 方法实现为宏。这是一个例子:
Getter 有效,但 setter 无效。它会产生奇怪的错误。
无意间我注意到了这样的事情。如果模块中不存在 getVal() 则
看起来不像Module.value = "???"
二传手。
有我的错误吗?如何解决这个问题?
scala - 是否可以使用可变参数定义宏,并为每个参数获取类型?
下面是一个明显的可变参数函数:
我们可以用类似的方式定义一个宏:
但在这种情况下,所有参数都输入为Any
. 事实上,编译器在编译时就知道类型,但对我们隐藏了它。是否可以在宏中获取参数列表及其类型?
scala - 在 scala 宏中推断树的类型
在宏内部,如何让编译器推断构造树的类型?我只找到了 Context.typeCheck,但它只检查类型但不返回结果。