这是不可能与当前斯卡拉REPL,但你可以使用Ammonite REPL实现类似的东西:
Welcome to the Ammonite Repl 0.8.2
(Scala 2.12.1 Java 1.8.0_121)
@ val x = 1
x: Int = 1
@ repl.sess.save("first")
res1_1: ammonite.repl.SessionChanged =
@ val x = 2
x: Int = 2
@ val y = 3
y: Int = 3
@ repl.sess.save("second") ; repl.sess.load("first")
res4_1: ammonite.repl.SessionChanged =
Removed Imports: Set('y, 'res1_1, 'res1_0)
@ y
cmd5.sc:1: not found: value y
val res5 = y
^
Compilation Failed
@ x
res5: Int = 1
这些会话并非完全按照您描述的方式进行嵌套,而是易于按名称进行跟踪,并且可以重叠。即在repl.sess.save("first")
之后,如果您不覆盖它,仍然可以访问原始x
。
玩了多一些之后,我能够炮制一个使用堆栈跟踪会话和负载的简单对象/保存。它可以放置在~/.ammonite/predef.sc
与菊REPL自动加载:
object SessionStack {
case class AmmSession(id: Int = 1) {
def name = s"session_${id}"
def next = AmmSession(id + 1)
}
private var sessions = collection.mutable.Stack.empty[AmmSession]
private var current = AmmSession()
def enter: Unit = {
sessions.push(current.copy())
repl.sess.save(current.name)
current = current.next
}
def exit: Unit = if(sessions.nonEmpty) {
current = sessions.pop()
repl.sess.load(current.name)
} else {
println("Nothing to exit.")
}
}
import SessionStack._
我没有测试过严格的这一点,所以有可能是未覆盖的边缘的情况下,但我可以走了轻松深入几层,然后剥离层。
那太棒了。 –
我不认为有这样做的回报,但是请! – triggerNZ
我没有REPL可用,但也许它会工作,当你用'{'输入一个块并用'}'留下时。所有的变量只能在这个块中生存,就像'{/ *做你的东西* /}; y // < - 这应该会导致一个错误' –