重新定义一个函数用于在Scheme中定义这个函数

Redefining a fuction used to define this function in Scheme

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

我可以创建一个新函数@:

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

这样 (@ 42 13) 给出 (42 + 13 + 1)。但是有没有办法做一些看起来像的事情:

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

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

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

#!r7rs

(import (except (scheme base) +)
        (rename (scheme base) (+ base:+)))

(define (+ . args)
  (apply base:+ 1 args))

(+ 1 1) ; ==> 3

在 R6RS 版本中它是相同的,除了 (scheme base)(rnrs base) Racket 有一些非常相似的东西:

#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