Lisp 是否可以在Scheme REPL中重置用户环境?

Lisp 是否可以在Scheme REPL中重置用户环境?,lisp,scheme,reset,read-eval-print-loop,Lisp,Scheme,Reset,Read Eval Print Loop,计划新手问题- 是否有一种方法可以在不退出并重新启动REPL的情况下重置当前REPL环境(即默认用户环境)?基本上,我想要一种方法来消除我当前的环境,这样我以前的定义就不会生效了。这是使用GNU/MIT方案 如果这是不可能的,那么在REPL中处理代码的最佳实践是什么?我听过人们谈论创建和删除包,但大多数例子似乎是针对CommonLisp的,这有点不同 我确实在Clojure REPL中找到了关于如何执行此操作的信息,但有一些警告,而且似乎是Clojure特有的: 谢谢 编辑:我可以通过退出并重新

计划新手问题-

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

如果这是不可能的,那么在REPL中处理代码的最佳实践是什么?我听过人们谈论创建和删除包,但大多数例子似乎是针对CommonLisp的,这有点不同

我确实在Clojure REPL中找到了关于如何执行此操作的信息,但有一些警告,而且似乎是Clojure特有的:

谢谢


编辑:我可以通过退出并重新启动REPL进程本身来完成相同的功能。我找到了这样做的方法,但使用vim屏幕保持与我的编辑器(vim)的连接处于活动状态。如果无法从REPL内部执行,那么这是一个可接受的解决方案。但是,我会让问题继续讨论一段时间,看看是否有一种方法可以在语言内部实现这一点,因为我认为这会很有启发性。

我认为这是特定于实现的,但在MIT方案中,您可以通过以下方式清除REPL环境:

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

麻省理工学院的计划有一系列的环境管理功能,你可以仔细阅读

我在Mac OS X(10.6.7)上进行了测试,MIT Scheme 9.0.1通过GNU站点的预构建二进制文件安装,并使用以下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> 
我认为不同的实现有不同的约定,但我不认为有任何东西像CommonLisp的包。如果你不喜欢麻省理工学院的方案,你应该看看Racket和Dr Racket,这是一个很好的IDE,可能比命令行中的普通REPL更强大,我认为它有某种模块系统。球拍是它自己的方言,所以取决于你在做什么,它可能不合适。(Racket中的默认语言模块与MIT Scheme不同)


最近(过去几个月),我一直在努力解决这些问题,当时我正在寻找一种方案,可以将Lisp中的代码分成小块运行,而Lisp中有一堆奇怪的宏。最后,赌博是最好的选择。如果您不需要这样做,请查看Racket。

我以前阅读过此文档,但仍不清楚如何完成我要做的事情。上述步骤似乎有效,但只起作用一次,可能会产生一些危险的副作用。它所做的是将当前环境切换到系统全局环境。之后,我所做的任何定义都将在全球环境中生效。此外,REPL现在处于更危险的模式,因为我可以在全球范围内重新定义标准过程。我想做的是创建一个全新的环境,它是系统全局环境的子环境,然后切换到它。我使用MIT Scheme,因为我跟随MIT开放式课程6.001,它是本课程的文本和当前学生使用的Lisp方言。球拍看起来很有趣。。。我是否可以将其视为等同于MIT方案,并忽略其其他功能,直到我以后需要它?有一个Racket SICP软件包,但你也可以看到其他人对这个特定组合的建议,这一组合以前就出现过:我不确定你说的“危险副作用”是什么意思,你能举个例子吗?我可以在一个新的REPL的顶层重新定义
汽车
cdr
等,而不必破坏环境。你也可以尝试
(ge(make top level environment))
,但我不知道有什么区别。你能停止REPL并重新启动它吗?是的,但我更喜欢下面给出的解决方案,因为我可以在文本缓冲区中保留该表达式,并在不离开编辑器的情况下将其发送到REPL,而重新启动REPL需要实际将焦点切换到其窗口,运行quit命令,然后调用新的REPL,这需要更长的时间。