我认为标题有点奇怪,但是,例如,有没有办法重新定义Scheme中的加法,以便 (+ arg1 arg2) 给出arg1 + arg2 + 1?
我可以创建一个新函数@:
(define @(lambda args (+ (apply + args) 1)))
使得 (@ 42 13) 给出 (42 + 13 + 1)。但是有没有办法做一些看起来像这样的事情:
(define + (lambda args (+ (apply + args) 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)
之外,它是相同的
Racket 有一些非常相似的东西:
#lang racket
(require (only-in racket/base [+ base:+]))
(define (+ . args)
(apply base:+ 1 args))
(+ 1 1) ; ==> 3
在 R5RS 报告方案及更早版本中,报告允许用户重新定义过程以扩展其功能,但对于定义的类型来说,它会导致与原始方案报告版本不同的结果,这是违规的。因此,像这样重新定义 +
是一种违规行为,并且不可移植。它可能在某些实现中起作用,但措辞是这样的,即智能的Scheme编译器可以进行常量折叠并期望从支持的类型中得到正确的结果。
#!r5rs
(define +
(let ((r5rs:+ +))
(lambda args
(apply r5rs:+ 1 args))))
(+ 1 1) ; ==> 2 or 3, perhaps an error
关于function - 重新定义一个函数,在Scheme中用来定义这个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68091735/