问题标签 [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 - 什么是“Scala 演示文稿编译器”?
什么是“Scala Presentation Compiler”?
scala - 使用 Global.Run 编译 Scala 代码时出现 MissingRequirementError
我正在尝试使用以下实例以编程方式编译 Scala 文件Global.Run
:
不幸的是,我得到一个MissingRequirementError
说法:
找不到编译器镜像中的对象 scala.runtime
所以我的问题是如何使用Run
类以编程方式编译文件,或者我在这里做错了什么?
我试图弄清楚是否可以更改settings
它以使其正常工作。实际上,我需要 Scala 文件中的类列表,path
不一定是完全可运行的输出。因此,如果符号仍未解决(如果我可以运行编译器阶段的一个子集),那会很好。
我也在Writing Scala Compiler Plugins,但如果我可以通过实例化 Compiler Run 对象来运行它,我更喜欢这个解决方案。我还偶然发现了Scala编译器是否可重入?(类似的代码,不同的问题),这让我觉得它可能会按照我的想法工作。
编辑 1:将 Scala JAR 添加到toolcp
(只是带有绝对路径的示例代码!)
根据评论,我将scalac.bat
类路径填充脚本改编为我的 Scala 代码:
scala - Scala 编译器生成抛出代码
我正在尝试更改其他人编写的编译器插件,该插件直接在打字机之后运行,我想生成引发异常的代码。
异常类如下所示:
不过,在实际代码中,这是一个内部类。
我查看了他如何获得固定类的符号并以类似的方式进行操作,我不知道是否有更好的方法,但这是他的操作方式:
为了抛出异常,我这样做了:
我认为,以下也是等效的(并且产生等效的行为)
但我有一个例外:
我想我不得不以不同的方式使用“新”,有人知道这是如何正确完成的吗?
scala - Scala 编译器不会终止(以编程方式调用)
我正在使用这段代码以编程方式编译 Scala 代码:
2.10 RC1 编译器工作了大约三分钟然后崩溃,而 2.10 无限地做某事(完全 CPU 使用)。当我通过 SBT(而不是以编程方式)调用编译器时,它可以正常工作并在不到一分钟的时间内完成编译。
缩短的输出如下所示(冗长 - 在第一行和错误之间运行三分钟):
Scala 2.10 稳定版
没有进一步的输出。1 个核心的 100% CPU 使用率。
斯卡拉 2.10 RC1
使用 RC1 大约 3 分钟后出现此错误:
下一段输出(也是我的应用程序崩溃之前的最终输出)是OutOfMemoryError
. 我不确定它的原因是代码本身还是编译错误。这两个选项对我来说都很奇怪,因为它在 SBT 控制台上编译并且编译器错误不应该消耗那么多内存,不是吗?
我偶然发现为什么在 Scala 中出现 OutOfMemoryError 编译错误?. 但是,我不确定我是否实际上只是缺少用于编译的堆空间。不涉及 Maven,它只有 Scala 代码和本地构建路径上的一些 JAR。
我正在寻找错误的原因OutOfMemory
或修复错误的调整。
scala - 有关于将 Scala 2.9 编译器插件迁移到 2.10 的任何信息吗?
我有一个 Scala 2.9 编译器插件(源代码),在 2.9 中工作得很好,但甚至不能用 2.10 编译。有几十个(可能有 100 多个)相同类型的错误,例如:
...最终以:
我需要一些关于 2.10 中发生了哪些变化或如何以其他方式处理此问题的信息或帮助......我尝试谷歌搜索并查看论坛,但发现关于此主题的信息很少。
将不胜感激任何帮助!
编辑:附加信息。这显然是在使用 ant 任务(参见堆栈跟踪)。该任务已定义:
编辑 2:更多附加信息:我设法使用命令行 2.10 编译器编译了这个插件(由于其他事情失败了还没有运行它)(记住 - 在 2.9 世界中一切都很好) - 基于 ant 的构建继续失败同样的方式(错误?)。我不得不做出两个改变。首先处理可变参数。有一种方法如:
还有另一种方法实际上是它的同义词,它是用 2.9 Scala 编写的:
我必须将其更改为以下内容才能使其正常工作:
另一个处理 'hasAssignedAnnotations' 不再出现在 ValOrDefDef.symbol 中(我只是将其注释掉以使其编译,而不是真正的修复)。
再说一次,有没有人知道可以帮助我迁移的网站或文档 - 即在我需要的方面从 2.9 更改为 2.10,包括编译器插件。
谢谢!
scala - Scala 编译器插件的动态加载
根据这篇文章为了创建一个Scala编译器插件,需要将插件编译成一个jar,然后要么指定对jar的引用作为命令行参数,要么将jar放在$SCALA_HOME/misc/scala-devel/plugins.
我需要在运行时调用编译器,使用 scala 编译器 API (scala.tools.nsc)。在调用编译器之前,是否可以在运行时动态地编译器插件?
scala - .eq 导致警告。我该如何摆脱它?
我在 Scala 中使用 JDO 和 DataNucleus 类型安全查询语言。因此,我的代码如下所示:
简而言之,这将对字段等于的所有DbObject
s运行查询。不幸的是,我收到以下警告:id
id
很明显,Scala 编译器认为这NumericExpression[Long]
是使用 的内置定义eq()
,类似于==
,但由于这是来自 Java,因此该eq()
方法与 Scala 的方法完全无关eq()
。
有没有办法摆脱警告?显然,这会发生很多,我担心这些非警告会隐藏真正的警告。
更新(2013-06-29)
这已在 Scala 2.10.2 中修复。警告消失了。
scala - 将闭包传递给 Scala 编译器插件
我正在尝试编写一个允许非常通用代码生成的 Scala 编译器插件:类似于 C 预处理器的通用性,但更安全(我不确定这是否是一个糟糕的想法,但这是一个有趣的练习)。我的理想用例如下所示:
重要的插件代码可能如下所示(基于this):
知道怎么做吗?请不要说“只使用宏”;至少在 2.10 中,它们还不够通用。
顺便说一句,我发现我概述的方法存在两个问题:1)编译器插件采用 AST,而不是闭包。它需要某种创建闭包的方法,可能会添加对用户代码的构建依赖项。2)用户无权访问 scala.reflect.internal.Trees.Tree,只能访问 scala.reflect.runtime.universe.Tree,因此插件需要在两者之间进行转换。
scala - 为什么 scala 编译器不会对模式匹配中总是产生 false 的 if 语句生成警告?
scala 编译器应该为我在下面评论过的 if 语句生成警告,但它没有。为什么?
如您所料,结果将是“第三”,但编译器应该在case a if(a == "A")
和 上生成警告if (a == "A")
,但可惜没有警告。
如果我编写以下代码,它的行为就像我期望的那样:
为什么会这样?
编辑:我使用的是 Scala 2.10.1。
scala - 了解 Scala GADT 支持的限制
Test.test 中的错误似乎不合理:
有几种方法可以使错误更改或消失:
如果我们删除特征 A(和案例类 B)上的 V 参数,错误的“GADT-skolem”部分就会消失,但“构造函数无法实例化”部分仍然存在。
如果我们将 Test 类的 U 参数移到 Test.test 方法中,错误就会消失。为什么 ?(同样,Test2.test2 中不存在该错误)
以下链接也确定了该问题,但我不理解提供的解释。http://lambdalog.seanseefried.com/tags/GADTs.html
这是编译器中的错误吗?(2.10.2-RC2)
感谢您为澄清这一点提供的任何帮助。
2014/08/05:我设法进一步简化了代码,并提供了另一个示例,其中 U 绑定在立即函数之外而不会导致编译错误。我仍然在 2.11.2 中观察到这个错误。
像这样简化,这看起来更像是编译器错误或限制。还是我错过了什么?