如何在Racket博士中取消定义?

如何在Racket博士中取消定义?,racket,Racket,在构建一些函数时,我可能会犯一些错误。发生这种情况时,我单击RUN,必须重新输入以前的所有定义和新的尝试 是否有某种方法可以“取消定义”前面的(定义(func args…)body)并继续执行?首先,行为是经过设计的。 变量不能在模块外变异。 这使优化器有机会 东西,各种各样的东西。 看见 请详细解释 如果需要修改模块内部的某些内容, 执行此操作的标准方法是使用参数 下面是一个滥用参数的快速破解(我指的是破解) 使重新定义成为可能 要将函数声明为可重定义,请使用重定义。 在本例中,函数foo被声

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


是否有某种方法可以“取消定义”前面的
(定义(func args…)body)
并继续执行?

首先,行为是经过设计的。 变量不能在模块外变异。 这使优化器有机会 东西,各种各样的东西。 看见 请详细解释

如果需要修改模块内部的某些内容, 执行此操作的标准方法是使用参数

下面是一个滥用参数的快速破解(我指的是破解) 使重新定义成为可能

要将函数声明为可重定义,请使用
重定义
。 在本例中,函数
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

首先,这种行为是故意的。 变量不能在模块外变异。 这使优化器有机会 东西,各种各样的东西。 看见 请详细解释

如果需要修改模块内部的某些内容, 执行此操作的标准方法是使用参数

下面是一个滥用参数的快速破解(我指的是破解) 使重新定义成为可能

要将函数声明为可重定义,请使用
重定义
。 在本例中,函数
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

很甜。我理解你的警告,我不会在生产环境中做这样的事情,但我想节省一些鼠标操作和复制粘贴。非常好。我理解你的警告,我不会在生产环境中做这样的事情,但我想节省一些鼠标操作和复制粘贴。