问题标签 [scala-compiler]
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 - 使用 NSC 编译 Scala 对象
有人可以举一个简单的例子来说明我如何在运行时从 JVM 中使用 scala.tools.nsc 编译 Scala 类吗?我正在尝试一些动态行为,我希望能够在运行时编译 Scala 类,然后加载和使用它们。我最感兴趣的是用原始类型的纯函数(双精度数、浮点数等)编译对象。谢谢!
scala - Scala下界错误:值不是类型参数的成员
scala 编译器似乎会为具有多个下限的语句提供错误的类型错误。
给定类Foo
,其方法使用和g
的下限A
B
来自https://stackoverflow.com/a/6124549和类X
,Y <: X
和Z <: X
,
正如预期的那样,以下代码可以正常工作:
出奇,
没有!_ (在 Scala 2.12.7、2.12.8、2.13.0-M5 中测试,但在 Dotty 中确实可以正常工作)
它产生error: value a is not a member of type parameter T
.
这是编译器中的错误还是有特定原因,为什么我不能a
调用new Foo(Y,Z).g.head
?
y
获取 type X
,因此编译器显然可以找出它new Foo(Y,Z).g.head
的 type X
,而我不明白,为什么将其分配给新值并调用该方法有助于类型检查器。另外,我认为,显式转换为X
不应该改变任何东西,但确实如此。
scala - 为什么将方法包装在另一个方法中会阻止 Scala 中的类型不匹配 - 在模式匹配中的类型参数中使用下划线?
在下面的代码块中(同时使用 scala2.11
和2.12
),该方法apply
不会编译,而applyInlined
可以。
错误信息是
- 我的主要问题是为什么?这是一个错误吗?
如您所见applyInlined
,不同之处在于它内联了wrapped
方法的主体。这意味着某种方法中某些代码的额外包装以某种方式“欺骗”了编译器工作。
另一个问题是你能想出一个设计/黑客来避免这种事情而不产生
Blar
协变吗?如何使内联版本编译?我可以用一个asInstanceOf
什么是 scala 推断类型以便在
wrapped
没有显式类型参数的情况下调用?
scala - 寻找现有的 scala 组合器解析器
是否有使用scala 组合器编写的带有解析器的存储库?我正在考虑使用 scala 组合器,它依赖于查找流行语言(python、c、java、cpp、scala、haskell)的现有解析器。
scala - 创建一个模棱两可的低优先级隐式
考虑包中提供的默认编解码器io
。
这是一个“低优先级”的隐式,因此很容易覆盖而不会产生歧义。
提高其优先级也很容易。
但我们可以朝相反的方向走吗?我们可以创建一个禁用(“歧义”?)默认值的低级隐式吗?我一直在研究优先级方程式并使用低优先级隐含,但我还没有创建一些对默认值模棱两可的东西。
scala - How does the Scala compiler perform implicit conversion?
I have a custom class, A
, and I have defined some operations within the class as follows:
In order to have something like 2.0 + x
make sense when x
is of type A
, I have defined the following implicit class:
This all works fine normally. Now I introduce a compiler plugin with a TypingTransformer
that performs some optimizations. Specifically, let's say I have a ValDef
:
where x
, y
, and z
are of type A
, and a
is a Double
. Normally, this compiles fine. I put it through the optimizer, which uses quasiquotes to change y + a * z
into something else. BUT in this particular example, the expression is unchanged (there are no optimizations to perform). Suddenly, the compiler no longer does an implicit conversion for a * z
.
To summarize, I have a compiler plugin that takes an expression that would normally have implicit conversions applied to it. It creates a new expression via quasiquotes, which syntactically appears the same as the old expression. But for this new expression, the compiler fails to perform implicit conversion.
So my question — how does the compiler determine that an implicit conversion must take place? Is there a specific flag or something that needs to be set in the AST that quasiquotes are failing to set?
UPDATE
The plugin phase looks something like this:
UPDATE 2
Please refer to this GitHub repo for a minimum working example: https://github.com/darsnack/compiler-plugin-demo
The issue is that a * z
turns into a.<$times: error>(z)
after I optimize the statement.
scala - 为什么这个不使用外部类的Scala内部类仍然获得对它的引用?
当我调试时,我看到这里的内部类获得了对其外部类的引用,即使它没有使用外部类中的任何值。内部类是内部类的唯一原因是它可以引用外部类的类型。
我添加final
试图删除对外部的引用,但没有成功。
为了减少内存消耗,我不希望小对象 SRCons 引用其外部类。但是,取消嵌套这个内部类会引入许多类型参数,这会使代码变得一团糟。
scala - 是否有一个类型类来检查是否存在至少一个隐式类型?
我有一个特征Foo[T, U]
和一个类型级别的算法,它给定一个L <: HList
和一个目标类型U
,告诉我是否存在这样一个隐含T
的范围。这是使用以下类型类实现的:L
Foo[T, U]
我们有以下内容:
我想要的是,如果范围内根本没有Foo[T, U]
for any ,则根本不会进行搜索T
,因为我们已经知道算法不会完成。换句话说,我想要一个类型类trait Exists[F[_]]
,当且仅当在范围内至少有一个隐式时才存在实例F
,因此该函数Search.apply
具有签名:
在这种情况下,编译器只会在范围内s
有任何隐式时尝试解析。Foo
这样的类型类可以定义吗?是否已经存在?
scala - Scala 编译器是否尝试减少几个顺序映射和平面映射之间的对象创建
这是一个关于 Scala 编译器的问题。
假设我有一个列表,并且我通过几个地图和平面地图来转换该列表。
假设我再对其进行一些改造。
我的问题可以分为两部分
为 生成 val 时
transformed
,底层 Java 字节码是否创建中间列表?我指的是在计算中对 map 和 flatMap 的连续调用transformed
。Scala 编译器可以将这些调用组合成一个 flatMap 吗?如果我在对象列表上进行操作,这将需要创建更少的中间对象。如果编译器是幼稚的并且只是创建中间对象,那么这可能会导致涉及长链 map 和 flatMap 的计算的相当大的开销。假设在上面创建的两个 val 中,我仅
moreTransformed
在进一步计算中使用(第二个 val)。也就是说,我只transformed
在计算中使用(第一个val)moreTransformed
而没有其他地方。Scala 编译器是否足够聪明,不会transformed
只为和计算创建列表moreTransformed
?transformed
将所有函数组合在and中是否足够聪明,moreTransformed
从而只生成一个 List,即 的值moreTransformed
?
scala - 如何以编程方式编译和运行 Scala 代码
我有以下代码,我想即时编译并运行它。
到目前为止,我已经尝试过如下方法:
在toolbox.compile(tree)
我无法获得Class
编译代码的对象之后。