可以在Scheme REPL中重置用户环境吗?

时间:2011-08-16 05:55:02

标签: lisp scheme reset read-eval-print-loop

计划新手问题 -

我有没有办法在不退出并重新启动REPL的情况下重置当前的REPL环境(即默认用户环境)?基本上我想要一种消灭我当前环境的方法,这样我以前的定义都没有生效。这是使用GNU / MIT Scheme。

如果这是不可能的,那么在REPL中乱码时最好的做法是什么?我听说人们谈论创建和删除包,但大多数例子似乎都是针对Common Lisp的,这有点不同。

我确实在Clojure REPL中找到了有关如何执行此操作的信息,但有一些警告,似乎是Clojure特定的:Can I clean the repl?

谢谢!

编辑:我可以通过退出并重新启动REPL进程本身来完成相同的功能。我找到了一种方法来做到这一点,但使用vim-screen保持与我的编辑器(vim)的连接。如果在REPL中无法做到这一点,这是一个可接受的解决方案。但是,我会把这个问题打开一段时间,看看是否有办法在语言中做到这一点,因为我认为这将是有益的。

1 个答案:

答案 0 :(得分:11)

我认为这是特定于实现的,但在MIT Scheme中,您可以使用以下命令清除REPL环境:

1 ]=> (ge (make-top-level-environment))

函数(ge [environment])“将当前REP循环环境更改为[environment]。”函数make-top-level-environment“返回一个新分配的顶级环境”。

MIT Scheme提供了许多环境管理功能,您可以仔细阅读here

我在Mac OS X(10.6.7)上通过GNU站点的预构建二进制文件安装了MIT Scheme 9.0.1进行了测试,并进行了以下REPL会话:

1 ]=> (define foo 1)

;Value: foo

1 ]=> foo

;Value: 1

1 ]=> (ge (make-top-level-environment))

;Value 13: #[environment 13]

1 ]=> foo

;Unbound variable: foo
;To continue, call RESTART with an option number:
; (RESTART 3) => Specify a value to use instead of foo.
; (RESTART 2) => Define foo to a given value.
; (RESTART 1) => Return to read-eval-print level 1.

2 error> 

我认为不同的实现有不同的约定,但我不认为有任何类似于Common Lisp的包。如果您没有与MIT Scheme结合,那么您应该查看Racket和Dr Racket,这是一个很好的IDE,可能比命令行上的普通REPL更强大,而且我认为它有某种模块系统。 Racket是它自己的Scheme方言,所以根据你所做的,它可能不合适。 (Racket中的默认语言模块与MIT Scheme不同)

我最近(过去几个月)一直在努力寻找一个可以运行Lisp in Small Pieces中的代码的Scheme,它有一堆奇怪的宏。 Gambit最终成为最好的选择。如果你没有这样的需要,请查看Racket。