Scala REPL 中的嵌套环境

2023-12-23

是否有可能创建(enter) Scala REPL 中的嵌套环境,这样之后exiting嵌套环境中,在退出环境中创建的所有变量绑定都会丢失?

这就是我的wish会话可能如下所示:

scala> val x = 1
x: Int = 1

scala> enter // How to implement this?
// Entering nested context (type exit to exit)

scala> val x = 2
x: Int = 2

scala> val y = 3
y: Int = 3

scala> exit // How to implement this?
// Exiting nested context

scala> assert(x == 1)

scala> y
<console>:12: error: not found: value y
       y
       ^

scala> 

当前的 Scala REPL 不可能实现这一点,但您可以使用菊石 REPL http://www.lihaoyi.com/Ammonite/#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使用 Ammonite 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._

我还没有对此进行严格测试,因此可能存在未覆盖的边缘情况,但我能够轻松地深入几个级别,然后剥离各层。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala REPL 中的嵌套环境 的相关文章

随机推荐

  • git (ls-remote) - 列出按创建日期排序的“远程”分支

    我知道通过下面的 git 命令我可以列出我所有的 远程 分支 someone someone pc somerepo git ls remote Username for https somegit com someone Password
  • scss:compass、gruntjs 和 Bower 安装基础 - 导入路径

    所以我有 yeoman 创建的以下目录结构 calvin tree L 2 Gruntfile js app 404 html bower components foundation favicon ico index html robot
  • Masonry 不适用于 Ember 中的无限滚动

    我正在尝试使用 Jquery Masonry 来无限滚动我的图片库 Masonry 仅适用于路线中的图像 但是在将新图像对象推送到之后images array 新形象出现在Dom但砌体不起作用 我见过Ember js jQuery maso
  • Delphi - 在主窗体创建上停止应用程序

    情况如下 在应用程序主窗体上创建事件时 某些条件未得到满足 因此应用程序需要关闭 是的 这是一个糟糕的设计 但是应用程序应该如何关闭 使用Application MainForm Close 生成一个AV 应用程序 终止 http docw
  • 什么是 Play 框架 Web 服务器

    有谁知道play使用哪个网络服务器 框架 我计划使用 Play 制作一个小型 Intranet 应用程序原型 我想知道是否应该使用默认的播放 Web 服务器或内部使用的 Apache 或 IIS 我不会预测应用程序的多个实例正在运行 也不会
  • 如何强制 xcode 对特定文件使用 ARC?

    我的项目包含 XMPPFramework 其中包含必须与 ARC 一起使用的文件 但我的项目是非 ARC 并且由于链接到它的某些其他库而无法转换 如何强制编译器仅在某个类上使用 ARC 这是以下问题的反问题这个问题 https stacko
  • svn relocate 错误 -- 无效的重定位目标

    我们的 svn 存储库的位置已更改为不同的 url 此外主干 分支和标签的相对路径也移动了一点 现在当我尝试svn relocate 我收到此消息 Invalid relocation destination https my repo s
  • Databricks (Spark):.egg 依赖项未自动安装?

    我有一个本地创建的 egg依赖的包boto 2 38 0 我使用 setuptools 来创建构建发行版 一切都在我自己的本地环境中运行 因为它获取boto正确地从PiP 然而在databricks当我将库附加到集群时 它不会自动获取依赖项
  • 如何快速创建一个可选的闭包?

    我试图在 Swift 中声明一个带有可选闭包的参数 我声明的函数如下所示 class Promise func then onFulfilled gt onReject gt if let callableRjector onReject
  • VSCode:防止分割编辑器在聚焦时调整大小?

    打开多个编辑器组 并且其中一个编辑器组足够小 聚焦较小的编辑器组会导致它变大 直到您切换回另一个编辑器 我希望将所有内容保留为我设置的大小 有没有设置可以防止这种情况发生 Note how it has to be made small f
  • 使用 Selenium WebDriver C# 从下拉列表中选择一个值 [重复]

    这个问题在这里已经有答案了 我在使用 WebDriver 的 C 绑定从下拉列表中选择值时遇到了困难 我过去既没有研究过 C 也没有研究过 WebDriver 我正在使用 WebDriver Selenium dotnet2 0b3 和 V
  • 在 MySql TIME 列中保存 LocalTime

    背景故事 我最近在保存时遇到了一个问题LocalTime to a TIMEMySQL 数据库中的列 节省价值9 00正在引起8 00保存在数据库中 这个问题没有出现在我的开发环境 Windows 上 但出现在我们尝试的两台 Linux 机
  • Scala 初始化行为

    请看下面的代码 trait MyTrait val myVal String class MyClass extends MyTrait val myVal Value class MyClass2 val myVal String ext
  • Cassandra 错误消息:由于本地暂停未将节点标记为关闭。为什么?

    我有 6 个节点 1 个 Solr 5 个 Spark 节点 使用 datastax 我的集群位于与 Amazon EC2 类似的服务器上 具有 EBS 卷 每个节点有3个EBS卷 使用LVM组成逻辑数据盘 在我的 OPS 中心 同一节点经
  • Python 文件吸食

    Python 中是否有一个单行代码可以读取文件的所有行 而不是标准的 f open x txt cts f read f close 看来这种事经常发生 所以必须有一句俏皮话 有任何想法吗 This will slurp the conte
  • 如何在 Windows 7 上查找 MAC 地址? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我可以使用命令找到我的机器的MAC地址ipconfig all在命令提示符下 网络上到处都说物理地址是MAC地址 这是命令的结果ipcon
  • CKEditor5 和 Angular2 - 在编辑器内单击以获取数据时获取插入符的准确位置

    在 Angular 2 中 当我单击某个对象内部时 我试图获取板条箱的确切位置CKEditor5 Balloon Editor实例 我将在页面上有几个实例 每个实例都通过 ViewChildren and a QueryList 每个实例都
  • Rust 中的不可变变量和 const 变量有什么区别?

    我了解到 如果变量没有使用显式声明为可变的mut 它变得不可变 声明后不能更改 那为什么我们有constRust 中的关键字 它们不是一样的吗 如果不是 它们有何不同 const 在 Rust 中是缩写constant并且与编译时评估 它显
  • 关闭 fancybox iframe 后 Chrome 中的后退按钮无法正常工作

    不久前我在 fancybox github 上发布了同样的问题 但当时问题无法解决 所以我想我可以在这里再试一次 在 Chrome 中 我打开 fancybox iframe 然后使用 iframe 页面上的链接进行导航 然后关闭 fanc
  • Scala REPL 中的嵌套环境

    是否有可能创建 enter Scala REPL 中的嵌套环境 这样之后exiting嵌套环境中 在退出环境中创建的所有变量绑定都会丢失 这就是我的wish会话可能如下所示 scala gt val x 1 x Int 1 scala gt