举个例子:
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 ...
过程(或取消定义阴影定义)?
实际上,当我们这样做时,内部会发生什么?内置是否被覆盖,或者两个过程是否在不同的名称空间中共存?
答案 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
。