gpt4 book ai didi

racket - Racket 允许函数重载吗?

转载 作者:行者123 更新时间:2023-12-01 09:45:57 28 4
gpt4 key购买 nike

我是 Lisp-scheme 的新手,对整个函数范式还很陌生,我目前正在做一个任务,要求我重载一个名称相同但参数集不同的函数 racket .下面是我试图实现的一个例子:

#lang racket

(define (put-ball-in-box two-by-fours nails ball)
... )

(define (put-ball-in-box box ball)
... )

这些不是实际的功能,但足够接近。正如暗示的那样,这两个函数都会将一个球放入一个盒子中,但是一个函数会先将盒子的组件组装起来,然后再调用另一个。显然,当我在 DrRacket 中或使用命令行尝试上述操作时,我得到了 module: duplicate definition for identifier ...错误。

有没有办法在 racket 中实现这一点? ?

也许答案就在我面前,但我花了最后两个小时来寻找这个并找不到任何东西,所以希望得到任何指点。

谢谢你。

最佳答案

它不是通常意义上的“在别处写另一个定义”。

它允许重影,即定义一个与导入过程同名的过程。这样你就可以(define + ...)以及您对 + 的定义将隐藏 +来自 racket/base .如果您想要原始程序,那么您可以执行以下操作,其中我定义了 +是加法或字符串附加。

 #lang racket/base
(require (rename-in racket/base (+ base:+)))

(define (+ . args)
(if (andmap string? args)
(apply string-append args)
(apply base:+ args)))

您可以做的另一件事是使用 racket/match根据参数的形状有不同的行为。
#lang racket/base
(require racket/match)
(define (fib . arg)
(match arg
[(list n) (fib n 1 0)]
[(list 1 a b) a]
[(list 0 a b) b]
[(list n a b) (fib (sub1 n) (+ a b) a)]))

第二个示例仍然不能完全满足您的要求,因为您必须转到原始定义点并修改 match条款。但这可能足以满足您的目的。

一个更复杂的例子是使用自定义语法来创建 define/overload形式。但我想你会找到 racket/match最好的解决方案。

关于racket - Racket 允许函数重载吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48614078/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com