如何在Scheme中运行时重载函数?

时间:2010-07-17 23:37:28

标签: scheme

室温。 我想在运行时重新定义一个函数,以便我可以在运行时更改系统的行为。 感谢。

3 个答案:

答案 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