通过搜索此站点和Web上的其他位置,JVM不支持尾调用优化.因此,这是否意味着如果要在JVM上运行,则不应写入可能在非常大的输入列表上运行的尾递归Scala代码(如下所示)?
// Get the nth element in a list
def nth[T](n : Int, list : List[T]) : T = list match {
case Nil => throw new IllegalArgumentException
case _ if n == 0 => throw new IllegalArgumentException
case _ :: tail if n == 1 => list.head
case _ :: tail => nth(n - 1, tail)
}
Run Code Online (Sandbox Code Playgroud)
Martin Odersky的Scala示例包含以下段落,似乎表明存在适合递归的情况或其他环境:
原则上,尾调用总是可以重用调用函数的堆栈帧.但是,某些运行时环境(例如Java VM)缺少基本条件,以使堆栈帧重用用于尾调用.因此,生产质量Scala实现只需要重新使用直接尾递归函数的堆栈帧,其最后一个操作是对自身的调用.其他尾调用也可以进行优化,但不应该在实现中依赖于此.
任何人都能解释一下这段中间两句话是什么意思吗?
谢谢!
我想知道如果Scala没有明确的企业支持,是否会获得应得的收益(我在想Sun/Oracle,但我想它可能是其他人,比如谷歌).
由于Sun最近决定不在JDK7中包含闭包,他们难道不能将他们的重量放在Scala那些希望拥有更具表现力的语言的Java替代品上吗?毕竟,在我看来,他们应该最关心的是JVM,而不是Java 本身.有人认为这可能吗?
我已经开始乱用我正在研究的编译器项目的ASM API.但是,我发现文档对很多地方的新手来说并不清楚,我认为有一个很好的例子,可以生成一个只打印"Hello,World!"的类.这将是一个很好的例子.
目前,我可以使用main()(使用ClassWriter,ClassVisitor和MethodVisitor类)生成一个类,但我似乎无法弄清楚如何生成main的主体.任何人都可以给我一个在ASM中生成类文件的示例:
JVM提供了出色的性能 - 一方面是它.另一方面,Golang听起来像一个新的范例,而且非常富有成效.如果我们能够将两个世界中最好的--JVM性能和golang生产力 - 汇集在一起,我们可以获得很多好处.有谁知道在java中提供golang实现的任何项目?
我遇到了这段代码:
n = args[0] as Long
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) }
Run Code Online (Sandbox Code Playgroud)
它用于打印树形结构.像这样:
*
***
*****
*******
*
Run Code Online (Sandbox Code Playgroud)
(for n= 4)
any在这种情况下使用什么以及如何处理它?
如果Kotlin函数调用为原语提供了原因,Int那么"传递的"类就是盒装基元的类,而不是未装箱的版本.
inline fun <reified T> reify() = T::class
@Test fun reified_type_doesnt_match_for_primitive() {
assertNotEquals(Int::class, reify<Int>())
assertNotEquals(Int::class.java, reify<Int>().java)
assertNotEquals<Any>(Int::class, reify<Int?>())
val nullableInt: Int? = 42
assertNotEquals(nullableInt!!.javaClass.kotlin, reify<Int>())
assertEquals<Any>(java.lang.Integer::class.java, reify<Int>().java)
}
@Test fun reified_type_matches_for_class() {
assertEquals(String::class, reify<String>())
}
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?
使用Scala的命令行REPL:
def foo(x: Int): Unit = {}
def foo(x: String): Unit = {println(foo(2))}
Run Code Online (Sandbox Code Playgroud)
给
error: type mismatch;
found: Int(2)
required: String
Run Code Online (Sandbox Code Playgroud)
看来你无法在REPL中定义重载的递归方法.我认为这是Scala REPL中的一个错误并提交了它,但它几乎立即关闭了"wontfix:我没有看到任何方式这可以支持解释器的语义,因为这两个方法必须编译一起." 他建议将方法放在一个封闭的对象中.
是否有JVM语言实现或Scala专家可以解释原因?我可以看到,如果这些方法相互调用,那将是一个问题,但在这种情况下?
或者,如果这个问题太大而且您认为我需要更多必备知识,那么是否有人有关于语言实现的书籍或网站的任何良好链接,特别是在JVM上?(我知道约翰罗斯的博客,以及编程语言语用学一书......但这就是它.:)
在Java世界(JVM上的脚本语言)和方法中,您首选的脚本语言是什么?您何时更喜欢脚本语言而不是Java(在什么情况下例如用于原型设计)?您是将它用于大型项目还是仅用于个人项目?
我是一名java开发人员,我想知道,学习Scala或Groovy等语言的主要好处是什么?
我最近听过很多关于Scala,Clojure等应该在JVM上运行的内容.这是否意味着这些语言正在实现下面的Java API?在JVM下运行语言意味着什么?
谢谢.
jvm-languages ×10
java ×6
jvm ×5
scala ×3
bytecode ×1
clojure ×1
compilation ×1
go ×1
groovy ×1
kotlin ×1
optimization ×1
recursion ×1