これは、現在のScalaの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
に引き続きアクセスできます。
セッションを追跡してロード/保存するためにスタックを使用する単純なオブジェクトを作成することができました。
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._
私はこの厳密にテストしていませんので、覆われていないエッジケースがあるかもしれませんが、私は行くことができました。アンモナイトREPLで自動的にロードするために~/.ammonite/predef.sc
に配置することができますいくつかのレベルの深さを簡単にしてから、レイヤーを剥がします。
それはすばらしいでしょう。 –
私はそれを行うためのreplがあるとは思わないが、はいよ! – triggerNZ
私はREPLを利用できませんが、 '{'でブロックを入力して '}'のままにするとうまくいくかもしれません。すべての変数は '{/ * do your stuff * /} 'のようにこのブロック内にしか存在しません。 y // < - これはエラーを起こすはずです ' –