重新定义特殊形式后有没有办法取回它们?

Flu*_*lux 0 scheme racket

Scheme 和 Racket 不保护特殊形式,因此可以重新定义它们。纯粹出于好奇,有没有办法在被覆盖后取回特殊形式?

示例情况:

$ racket
Welcome to Racket v6.11.
> (define define 1)
> (+ define define)
2
> (define x 3)  ; How to get the original 'define' back?
; x: undefined;
;  cannot reference undefined identifier
; [,bt for context]
>
Run Code Online (Sandbox Code Playgroud)

如果我重新定义一个特殊形式,有没有办法找回特殊形式?

Sor*_*ase 5

特别是在 REPL 中,定义覆盖是可能的,您可以简单(require (only-in racket/base define))define返回。

Welcome to Racket v7.3.
> (define define 1)
> (+ define define)
2
> (require (only-in racket/base define))
> (define x 3)
> x
3
Run Code Online (Sandbox Code Playgroud)

对于 Racket 文件/模块,一个简单的答案是,一旦您进行了顶级定义,就无法重新定义它。但是,您仍然可以(require (only-in racket/base [define racket:define]))defineracket/baseas重命名racket:define),然后racket:define改为使用。另请注意,虽然您无法重新定义顶级定义,但您可以对其进行隐藏,因此您可以define(let-syntax ([define (make-rename-transformer #'racket:define)]) ...)例如的正文中使用。

但请注意,在 Racket 中,您可以覆盖#%module-begin对您的文件/模块具有完全控制权的,因此您可以使用此功能创建一种新语言,允许您重新定义顶级定义,尽管此时您不再使用“真正的”球拍。