如果我影响了一个buit-in函数,我该如何恢复呢?

时间:2016-05-28 09:44:26

标签: scheme racket

举个例子:

for (int i = 0; i < 200000; i++) {
    synchronized (n) { / Here!
        temp = n.getN();
        n.setN(temp + 1);
    }
}

如何在不重新启动解释器的情况下调用原始内置(define sqrt (lambda (x) (* 2 (sqrt x)))) (sqrt 2) 2.828427 ... 过程(或取消定义阴影定义)?

实际上,当我们这样做时,内部会发生什么?内置是否被覆盖,或者两个过程是否在不同的名称空间中共存?

1 个答案:

答案 0 :(得分:3)

您对sqrt的定义实际上会导致堆栈溢出,因为它会自行递归,而不是内置sqrt。 :-P

无论如何,在Racket中,您对sqrt的定义只会影响您当前的模块。可以使用其他名称重新导入内置sqrt,并从特定于模块的sqrt中调用它:

(require (rename-in racket/base [sqrt racket-sqrt]))
(define sqrt (lambda (x) (* 2 (racket-sqrt x))))

请注意,您的代码不会影响其他未导入模块sqrt定义的模块;他们将继续使用内置的sqrt