问题标签 [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 - Why do my bytes appear to get corrupted when I try to write them from inside if statements or pattern matches
I'm playing with Pickled Scala signatures, writing bytes to a PickleBuffer and reading them back out with ShowPickled.
I can write and read back an Int
as expected by using
PB.myBuf.writeByte(2)
giving the '2' (a reference to an entry number in this case) in
1(MyRecord) 2 40[case] 5
.
But if I but that same code inside a conditional like:
if (ExtModClassRef.position==0) PB.myBuf.writeByte(2)
,
or
ExtModClassRef.position match {case 0 => PB.myBuf.writeByte(2)}
,
then the bytes that I read back are garbled:
0,4: CLASSsym 4: 1(MyRecordmodels\00\00
...
instead of how the first few entries should be:
0,4: CLASSsym 4: 1(MyRecord) 2 40[case] 5
1,10: TYPEname 8: MyRecord
2,20: EXTMODCLASSref 1: 3(models)
3,23: TERMname 6: models
I'm puzzled as to how the if
and match
keywords could have any effect on what bytes are written.
And perhaps someone can suggest a fix or a workaround?
Thank you, Julian
scala - “未找到编译器镜像中的 scala.runtime”,但在使用 -Xbootclasspath/p:scala-library.jar 启动时工作
我正在尝试运行打包为 JAR(包括依赖项)的 Scala 应用程序,但这会失败,直到使用该-Xbootclasspath/p
选项添加 Scala 库。
调用失败:
在应用程序完成了一些预期的输出后,控制台显示:
线程“主”scala.reflect.internal.MissingRequirementError 中的异常:未找到编译器镜像中的对象 scala.runtime。在 scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:16) 在 scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:17) 在 scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors .scala:48) 在 scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:40) 在 scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:61) 在 scala.reflect.internal。在 scala.reflect.internal.Mirrors$RootsBase.getRequiredPackage(Mirrors.scala:175) 在 scala.reflect.internal.Definitions$DefinitionsClass 的 Mirrors$RootsBase.getPackage(Mirrors.scala:172)。
工作调用:
奇怪的是,它的application-assembly-1.0.jar
构建是为了包含所有依赖项,包括 Scala 库。当提取 JAR 文件时,可以验证scala.runtime
包中的类文件是否已包含在内。
JAR 文件的创建
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.1")
被添加到project/plugins.sbt
并assembly
调用了目标。一个大约 25MB 的 JAR 文件结果。
使用 proguard 构建 JAR 显示了与在程序集的 JAR 文件中看到的相同的运行时行为。
触发 MissingRequirementError 的应用程序代码
一些应用程序代码可以正常工作,并且只要new Run
执行以下片段,就会触发前面描述的异常。
其中scala-library
,scala-compiler
和scala-reflect
被定义为 中的依赖项build.sbt
。
对于古玩/背景信息
该应用程序的目的是帮助 Java 和 Scala 程序的本地化。上面代码片段的任务是从 Scala 文件中获取 AST,以便在其中找到方法调用。
问题
- 鉴于 Scala 库包含在 JAR 文件中,为什么需要使用 调用 JAR
-Xbootclasspath/p:scala-library.jar
? - 为什么应用程序的其他部分运行得很好,即使
scala.runtime
后来报告为丢失?
scala - 解决 SBT 中 Scala 宏和编译器框架的依赖关系
我正在尝试编写一个框架以使编写 Scala 编译器插件更容易,我正在做的是在 Scala quasiquotes 之上编写一个框架。所以我的项目依赖于宏天堂的宏以及 scala-compiler 和 scala-reflect 库。
我按照此处提到的说明编写了一个 SBT 构建脚本:https ://github.com/scalamacros/sbt-example-paradise/blob/master/project/Build.scala
并使用 scalaVersion 2.11.0-SNAPSHOT, 2.10.3-SNAPSHOT, 2.10.3-RC1, 2.10.2 编译我的项目,但它们都不起作用。这是我的 sbt 构建脚本:
使用 scalaVersion 2.10-3-RC1,我收到以下错误:
使用 scalaVersion 2.11.0-SNAPSHOT,我收到以下错误:
在使用 2.10.3-SNAPSHOT 版本时,我得到了以下信息:
而且 2.10.2 版根本无法解决 scala-library、scala-reflect 和 2.10.2 的依赖关系(如 2.10.3-RC1)!
我的问题是,是否有可能混合编译器 API 和宏 API 并使它们在 SBT 下工作,如果是的话,我的构建脚本到底有什么问题?
scala - Scala:编译器可以有效地优化常量吗?
让我们考虑以下几点:
这太冗长了,与 Java 的静态(最终)变量相比似乎并不优雅,尤其是因为常量的定义和用法相距太远,无法立即理解代码。我想要的是这样的:
问题是,Scala 编译器是否足够聪明,不会为每个 Foo 实例实例化 BUFFER_SIZE 以浪费时间和空间?还是应该选择第一个?
java - scala - 获取符号的类/源文件名和位置
因为 scala 类名可能与源文件名不匹配。
如何在 jar 中找到 scala 类型所属的 .class 文件。
在 scala.reflect.api.Symbols.Symbol 类型中,有一个值叫做 associatedFile,但是它总是返回 null
如何以编程方式获取类文件名?
更详细:如果我得到二进制/源 jar,例如 scala-library.jar,scala-library-src.jar。如何判断源 jar 中的哪个源文件来自二进制 jar 中的类。
Scala 演示编译器可以告诉这个信息吗?
scala - scala运行时反映有时会抛出异常
当我在其他类中Reflects
调用方法时,我定义了一个对象caseFields
有时此方法会引发以下异常
和其他奇怪的例外。
这种方法有什么问题
scala - 如何以编程方式调用 Scala 编译器?
我希望我的 Scala 代码将 Scala 类作为输入,编译并执行该类。如何以编程方式调用 Scala 编译器?我将使用最新的 Scala 版本,即 2.10。
scala - Scala 编译器如何在 trait 中定义 final val?
我经常使用无私的特征模式,并且我需要在特征中使用“昂贵的”常量:我希望在我的所有应用程序中拥有这些值的单个实例,这可能需要计算几个步骤。
然而,无私的特质模式导致了以下设计:
- 一个特质 MyStuff
- 一个对象 MyStuff 扩展了 MyStuff
显然,将常量放在对象中并在 trait 中使用它们会产生循环依赖。然而,将它们放在 trait 上,使得所有扩展 trait 的类都可以覆盖它们,因此它们肯定不是应用程序范围的单例。
Scala 编译器是否“足够聪明”以使特征中的最终 val 变为“旧的 java public static final”?