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)
如果我重新定义一个特殊形式,有没有办法找回特殊形式?
特别是在 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]))
(define
从racket/base
as重命名racket:define
),然后racket:define
改为使用。另请注意,虽然您无法重新定义顶级定义,但您可以对其进行隐藏,因此您可以define
在(let-syntax ([define (make-rename-transformer #'racket:define)]) ...)
例如的正文中使用。
但请注意,在 Racket 中,您可以覆盖#%module-begin
对您的文件/模块具有完全控制权的,因此您可以使用此功能创建一种新语言,允许您重新定义顶级定义,尽管此时您不再使用“真正的”球拍。