室温。 我想在运行时重新定义一个函数,以便我可以在运行时更改系统的行为。 感谢。
答案 0 :(得分:5)
(define (foo x) ...stuff...)
(set! foo (lambda (x) ...different stuff...))
答案 1 :(得分:1)
建议在本地使用let这样做,这也适用于这种意义上的关键字:
(let ((define +))
(define 2 3)) ; ===> 5
甚至将它们重新定义为常量,请记住,Scheme是一个lisp-1:
(let ((define 2) (+ 4))
(- define +)) ; ===> -2
甚至:
(let ((quote /))
'3) ===> 1/3
仅在本地执行此操作可保留功能样式。
答案 2 :(得分:0)
假设您要重载之前定义的函数,只需再次定义它。这也适用于重新定义诸如汽车和cdr之类的功能,例如把汽车变成cdr:
(define(car x)(cdr x))
但是,我认为你无法通过这种重新定义影响其他已定义的功能,因此使用汽车的系统功能仍将使用原始系统车而不是你的:< / p>
(定义(测试x)(车x))
(define(car x)(cdr x))
(测试'(1 2 3))
1
我猜其原因在于,一旦函数被读取或评估,符号就会消失,符号会被它们所绑定的符号所取代;在这种情况下,函数的实际代码。因此,将符号重新绑定到不同的函数不会影响已定义代码的其余部分。这通常是一件好事,因为它有助于维护参考透明度。
如果要重新定义方案关键字,例如lambda或cond,请使用let-syntax(请参阅http://community.schemewiki.org/?scheme-faq-language)