function - 重新定义一个函数,在Scheme中用来定义这个函数

标签 function scheme racket redefinition

我认为标题有点奇怪,但是,例如,有没有办法重新定义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/

相关文章:

r - 对数似然的优化,传入不同的数据集

list - 获取值未列出 lisp 中的缺点

scheme - 将Scheme常量转换为等效的Common Lisp

scheme - Racket 语言变更和模块问题

input - 为什么此列表在 Racket 中只有无效项目

Swift 3.0 map 似乎迭代了 1 个循环

c - 将变量传递给 C 中的函数

javascript - 使用窗口对象练习我的对象字面量函数

scheme - 空值之间的区别?和空的?在计划中

scheme - 用于定义给定重复模式的功能的 Racket 宏