【问题标题】:Redefining a fuction used to define this function in Scheme重新定义一个用于在Scheme中定义这个函数的函数
【发布时间】:2021-06-22 23:24:52
【问题描述】:

我认为标题有点奇怪,但是,例如,有没有办法重新定义 Scheme 中的加法,以便 (+ arg1 arg2) 得到 arg1 + arg2 + 1?

我可以新建一个函数@:

(define @ (lambda args (+ (apply + args) 1)))

使得 (@ 42 13) 得到 (42 + 13 + 1)。但是有没有办法做一些看起来像:

(define + (lambda args (+ (apply + args) 1)))

但当然没有错误,因为这里说 + 是未定义的?

【问题讨论】:

    标签: function scheme racket redefinition


    【解决方案1】:

    在 R7RS 版本的 Scheme 中,我们有导入,所以在这里我们可以做到:

    #!r7rs
    
    (import (except (scheme base) +)
            (rename (scheme base) (+ base:+)))
    
    (define (+ . args)
      (apply base:+ 1 args))
    
    (+ 1 1) ; ==> 3
    

    在 R6RS 版本中除了 (scheme base)(rnrs base) 球拍有一些非常相似的东西:

    #lang racket
    
    (require (only-in racket/base [+ base:+]))
        
    (define (+ . args)
      (apply base:+ 1 args))
    
    (+ 1 1) ; ==> 3
    

    在 R5RS 报告方案和更早的版本中,报告允许用户重新定义程序以扩展其功能,但是对于已定义的类型,它会导致与原始方案报告版本不同的结果,这是违反规定的。因此像这样重新定义+ 是一种违规行为,并且不能移植Scheme。它可能在某些实现中起作用,但是这样的措辞是为了让智能 Scheme 编译器可以进行常量折叠并期望从支持的类型中得到正确的结果。

    #!r5rs
    
    (define + 
      (let ((r5rs:+ +))
        (lambda args
          (apply r5rs:+ 1 args))))
    
    (+ 1 1) ; ==> 2 or 3, perhaps an error
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2011-02-03
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多