我对 Lisp 方案很陌生,对整个函数范式相当陌生,目前正在做一项作业,要求我重载一个具有相同名称但不同参数集的函数racket。下面是我想要实现的目标的示例:
#lang racket
(define (put-ball-in-box two-by-fours nails ball)
... )
(define (put-ball-in-box box ball)
... )
Run Code Online (Sandbox Code Playgroud)
这些不是实际的功能,但足够接近。正如所暗示的,两个函数都会将一个球放入一个盒子中,但一个函数会首先从其组件组装盒子,然后调用另一个函数。显然,当我在 DrRacket 中或使用命令行尝试上述操作时,出现错误module: duplicate definition for identifier ...。
有没有办法实现这一点racket?
也许答案就在我面前,但我花了两个小时寻找这个,但找不到任何东西,所以将不胜感激。
谢谢。
小智 6
它并不是通常意义上的“在其他地方编写另一个定义”。
它允许重影,即定义与导入过程同名的过程。因此,您可以(define + ...)并且您的定义+will 隐藏+from racket/base。如果您想要原始过程,那么您可以执行类似以下操作,其中我定义+为添加或字符串附加。
#lang racket/base
(require (rename-in racket/base (+ base:+)))
(define (+ . args)
(if (andmap string? args)
(apply string-append args)
(apply base:+ args)))
Run Code Online (Sandbox Code Playgroud)
您可以做的另一件事是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)]))
Run Code Online (Sandbox Code Playgroud)
第二个示例仍然没有完全达到您想要的效果,因为您必须转到原始定义点并修改子句match。但这可能足以满足您的目的。
一个更复杂的示例是使用自定义语法来创建表单define/overload。但我认为你会找到racket/match最好的解决方案。