问题标签 [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.

0 投票
1 回答
66 浏览

scala - 使用 NSC 编译 Scala 对象

有人可以举一个简单的例子来说明我如何在运行时从 JVM 中使用 scala.tools.nsc 编译 Scala 类吗?我正在尝试一些动态行为,我希望能够在运行时编译 Scala 类,然后加载和使用它们。我最感兴趣的是用原始类型的纯函数(双精度数、浮点数等)编译对象。谢谢!

0 投票
0 回答
88 浏览

scala - Scala下界错误:值不是类型参数的成员

scala 编译器似乎会为具有多个下限的语句提供错误的类型错误。

给定类Foo,其方法使用和g的下限AB

来自https://stackoverflow.com/a/6124549和类XY <: XZ <: 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不应该改变任何东西,但确实如此。

在线尝试!

0 投票
1 回答
104 浏览

scala - 为什么将方法包装在另一个方法中会阻止 Scala 中的类型不匹配 - 在模式匹配中的类型参数中使用下划线?

在下面的代码块中(同时使用 scala2.112.12),该方法apply不会编译,而applyInlined可以。

错误信息是

  1. 我的主要问题是为什么?这是一个错误吗?

如您所见applyInlined,不同之处在于它内联了wrapped方法的主体。这意味着某种方法中某些代码的额外包装以某种方式“欺骗”了编译器工作。

  1. 另一个问题是你能想出一个设计/黑客来避免这种事情而不产生Blar协变吗?如何使内联版本编译?我可以用一个asInstanceOf

  2. 什么是 scala 推断类型以便在wrapped没有显式类型参数的情况下调用?

0 投票
1 回答
220 浏览

scala - 寻找现有的 scala 组合器解析器

是否有使用scala 组合器编写的带有解析器的存储库?我正在考虑使用 scala 组合器,它依赖于查找流行语言(python、c、java、cpp、scala、haskell)的现有解析器。

0 投票
2 回答
803 浏览

scala - 创建一个模棱两可的低优先级隐式

考虑包中提供的默认编解码器io

这是一个“低优先级”的隐式,因此很容易覆盖而不会产生歧义。

提高其优先级也很容易。

但我们可以朝相反的方向走吗?我们可以创建一个禁用(“歧义”?)默认值的低级隐式吗?我一直在研究优先级方程式并使用低优先级隐含,但我还没有创建一些对默认值模棱两可的东西。

0 投票
1 回答
210 浏览

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.

0 投票
0 回答
99 浏览

scala - 为什么这个不使用外部类的Scala内部类仍然获得对它的引用?

当我调试时,我看到这里的内部类获得了对其外部类的引用,即使它没有使用外部类中的任何值。内部类是内部类的唯一原因是它可以引用外部类的类型。

我添加final试图删除对外部的引用,但没有成功。

为了减少内存消耗,我不希望小对象 SRCons 引用其外部类。但是,取消嵌套这个内部类会引入许多类型参数,这会使代码变得一团糟。

0 投票
2 回答
378 浏览

scala - 是否有一个类型类来检查是否存在至少一个隐式类型?

我有一个特征Foo[T, U]和一个类型级别的算法,它给定一个L <: HList和一个目标类型U,告诉我是否存在这样一个隐含T的范围。这是使用以下类型类实现的:LFoo[T, U]

我们有以下内容:

我想要的是,如果范围内根本没有Foo[T, U]for any ,则根本不会进行搜索T,因为我们已经知道算法不会完成。换句话说,我想要一个类型类trait Exists[F[_]],当且仅当在范围内至少有一个隐式时才存在实例F,因此该函数Search.apply具有签名:

在这种情况下,编译器只会在范围内s有任何隐式时尝试解析。Foo

这样的类型类可以定义吗?是否已经存在?

0 投票
2 回答
88 浏览

scala - Scala 编译器是否尝试减少几个顺序映射和平面映射之间的对象创建

这是一个关于 Scala 编译器的问题。

假设我有一个列表,并且我通过几个地图和平面地图来转换该列表。

假设我再对其进行一些改造。

我的问题可以分为两部分

  1. 为 生成 val 时transformed,底层 Java 字节码是否创建中间列表?我指的是在计算中对 map 和 flatMap 的连续调用transformed。Scala 编译器可以将这些调用组合成一个 flatMap 吗?如果我在对象列表上进行操作,这将需要创建更少的中间对象。如果编译器是幼稚的并且只是创建中间对象,那么这可能会导致涉及长链 map 和 flatMap 的计算的相当大的开销。

  2. 假设在上面创建的两个 val 中,我仅moreTransformed在进一步计算中使用(第二个 val)。也就是说,我只transformed在计算中使用(第一个val)moreTransformed而没有其他地方。Scala 编译器是否足够聪明,不会transformed只为和计算创建列表moreTransformedtransformed将所有函数组合在and中是否足够聪明,moreTransformed从而只生成一个 List,即 的值moreTransformed

0 投票
1 回答
402 浏览

scala - 如何以编程方式编译和运行 Scala 代码

我有以下代码,我想即时编译并运行它。

到目前为止,我已经尝试过如下方法:

toolbox.compile(tree)我无法获得Class编译代码的对象之后。