重新定义一个函数用于在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
我觉得这个标题有点奇怪,但是,例如,有没有办法重新定义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