在构建某些功能时,我可能会犯一些错误。发生这种情况时,我单击 RUN 并且必须重新输入所有以前的定义和新的尝试。
有什么方法可以“取消定义”前一个(define (func args ...) body)
并继续前进吗?
在构建某些功能时,我可能会犯一些错误。发生这种情况时,我单击 RUN 并且必须重新输入所有以前的定义和新的尝试。
有什么方法可以“取消定义”前一个(define (func args ...) body)
并继续前进吗?
首先,行为是设计使然。变量不能在模块外改变。这使优化器有机会内联各种事物。有关详细说明,请参阅http://docs.racket-lang.org/guide/module-set.html 。
如果您需要修改模块内部的某些内容,那么标准的做法是使用参数。
这是一个快速 hack(我的意思是 hack),它滥用参数使重新定义成为可能。
要将函数声明为可重新定义,请使用redefineable
. 在这个例子中,一个函数foo
被声明为可重定义的。
#lang racket
(define-for-syntax (make-current-name stx id)
(datum->syntax
stx (string->symbol
(format "current-~a" (syntax-e id)))))
(define-syntax (redefine stx)
(syntax-case stx ()
[(_ (name arg ...) body ...)
(with-syntax ([current-name (make-current-name stx #'name)])
#'(current-name (lambda (arg ...) body ...)))]))
(define-syntax (redefineable stx)
(syntax-case stx ()
[(_ name)
(with-syntax ([current-name (make-current-name stx #'name)])
#'(begin
(define current-name (make-parameter (λ x (error 'undefined))))
(define (name . xs)
(apply (current-name) xs))))]))
(redefineable foo)
(redefine (foo x) (+ x 1))
现在运行程序,在交互窗口中,我们现在可以执行以下操作:
Welcome to DrRacket, version 5.3.0.6--2012-05-11(9401a53/a) [3m].
Language: racket.
> (foo 41)
42
> (redefine (foo x y) (* x y))
> (foo 2 3)
6