【问题标题】: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