Scheme 方案:重载内置程序,一般重载

Scheme 方案:重载内置程序,一般重载,scheme,overloading,Scheme,Overloading,更具体地说,是否可以重载内置的Scheme过程显示 更一般地说,如何在Scheme中重载任何过程?Scheme没有基于Java/C++类型的重载,它是动态类型的,因此没有意义 不过,您可以做一些事情: 可以根据参数的结构重载: (define overload1 (case-lambda ((x y) (+ x y)) ((x y z) (+ (- x y) z)))) 但这并不能真正帮助您,因为无论发生什么情况,display只接受一个参数 (defi

更具体地说,是否可以重载内置的Scheme过程显示


更一般地说,如何在Scheme中重载任何过程?

Scheme没有基于Java/C++类型的重载,它是动态类型的,因此没有意义

不过,您可以做一些事情:

可以根据参数的结构重载:

(define overload1
    (case-lambda
        ((x y) (+ x y))
        ((x y z) (+ (- x y) z))))
但这并不能真正帮助您,因为无论发生什么情况,
display
只接受一个参数

(define (overload-kinda x)
    (cond
        ((list? x) (do-list x))
        ((symbol? x) (do-sym x))
        ;etc
        ))
这有点老套,但有时是必要的

我通常的方法是高阶函数和lambda情况

(define my-display
    (case-lambda
        ((x) (display x))
        ((x f) (display (f x)))))

现在,如果我们需要特殊处理来显示我们在函数中传递的任何内容来呈现它。

接受的答案不会使函数过载,只定义具有相同行为的不同函数

Scheme通常允许覆盖bultin函数,因此要使函数过载(例如,
显示
),可以使用一种称为:

(定义显示(let((原始显示))
(λ(x.剩余)
(let((端口)(如果为空,则为rest)
(电流输出端口)
(汽车休息)
(如有)(编号?x)
(原始(字符串附加“#”)端口)
(原x端口(()())))
现在显示器对数字的处理方式不同了。您还可以使用自定义类型,如以特定方式显示不同类型的记录。这是一个通用示例,说明如何用任何允许修改原始绑定的语言覆盖bultin函数。将原始函数保存在变量中,重新定义函数,如果要调用原始函数,则使用保存原始函数的变量

代码可以抽象为通用宏,该宏将重新定义函数并在特定类型的参数上运行代码,因此它将像Java中那样是适当的重载,而不仅仅是基于像
case lambda
中那样的参数数量

以下是此类宏的示例(使用lisp类型的宏):

(定义宏(重载名称规范体)
(出租((名称(车辆名称规范))
(参数(cdr名称规范)))
`(定义,名称(let(,名称,名称))
(λ,args
,@body(()())
(过载(显示x.静止)
(let((端口)(如果为空,则为rest)
(电流输出端口)
(汽车休息)
(如有)(编号?x)
(显示(字符串附加“#”)端口)
(显示x端口)))
(显示器10)
;; ==> #
(显示“20”)
;; ==>  20