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