我怎么在Drracket中未定义?

时间:2012-05-28 18:47:14

标签: racket

在构建一些功能时,我会犯一些错误。发生这种情况时,我单击RUN并重新输入所有先前的定义和新的尝试。

有没有办法“取消定义”之前的(define (func args ...) body)并继续前进?

1 个答案:

答案 0 :(得分:4)

首先,行为是设计的。 变量不能在模块外变异。 这为优化器提供了一个机会 事情,内联各种事物。 见http://docs.racket-lang.org/guide/module-set.html 有详细解释。

如果你需要修改模块内的东西, 这样做的标准方法是使用参数。

这是一个滥用参数的快速黑客(我的意思是黑客) 使重新定义成为可能。

要声明要重新定义的函数,请使用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